1

私は構造体を持っています:

typedef struct _test{
   int a;
   int b;
   int c;
   float f_arr[16384];
}test_t;

その構造体をcsv形式でファイルに書き込む必要があります。snprintf 関数を使用してすべてを 1 つの char バッファーに入れることができると考えましたが、f_arr から各値を変換する必要があります。

   char f_t_str[30];
   char arr[16384*2][30];
   for (i=0; i< 16384; i++){
       sprintf(f_t_str, "%.8f" ,test_t->f_arr[i]);
       memcpy(arr[i*2], f_t_str, strlen(f_t_str));
       printf("%s\n",arr[i*2]);
       arr[i*2 + 1][0] = ',';
   }

したがって、float 配列を arr で 1 つの大きな文字列に変換した場合は、次のように作成できます。

char dest[16384*2 + 512];
snprintf(dest, 16384*2 + 512, "%d,%d,%d,%s", test_t->a, test_t->b, test_t->s, arr);

しかし、結果として私は持っています:

10,11,12,13.1

それ以外の:

10,11,12,13.1,13.2,14.4.... [16384] ... 16400.23

float から char への変換中に文字列の末尾にsprintf追加されるため、次(ループが終了した後のもの) はそれが満たされた後に終了すると思います-「arr」からの最初の値。それを機能させる方法は?'\0'snprintf'\0'

よろしく、J.

4

2 に答える 2

1

次のようなことを試してみませんか?(末尾のコンマが残っているため、少しラフで準備ができています。) ここで実行されるコードを参照してください - http://ideone.com/EnU6Sa

このコードでは、追加のポインターを使用して、バッファーに書き込んだばかりの float 文字列の先頭を指しています。このようにして、文字列の長さを決定し、この量だけポインターを増やして、末尾の NULL を指すことができます。したがって、次の snprintf はその NULL を次の文字列などで上書きします...

#include <stdio.h>

#define TEST_BUFFER_CHARS 255
#define DIM(x) (sizeof(x)/sizeof((x)[0]))

int main(void) 
{
    int i;
    char testBuffer[TEST_BUFFER_CHARS] = {'\0'};
    char *loc = testBuffer;
    size_t testBufferSpace = TEST_BUFFER_CHARS;
    size_t tempLen;
    float testFloats[] = { 1.1, 1.2, 1.3, 1.4 };

    for(i = 0; i < DIM(testFloats); ++i)
    {
        snprintf(loc, testBufferSpace, "%f, ", testFloats[i]);
        tempLen = strlen(loc);
        loc += tempLen;
    }

    printf(testBuffer);

    return 0;
}
于 2013-09-17T10:05:40.687 に答える