1

我有一个结构:

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

该结构我需要以 csv 格式写入文件。我想我可能会使用 snprintf 函数将所有内容放入一个字符缓冲区,但是:我需要从 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] = ',';
   }

所以,如果我现在将我的浮点数组转换为 arr 中的一个大字符串,我可以制作一个:

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

该代码使用一个额外的指针来指向您刚刚写入缓冲区的浮点字符串的开头。通过这种方式,我们可以确定字符串长度并将指针增加这个数量,以便指向尾随的 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 回答
1

由于您需要 CSV 格式,我假设您将程序的输出重定向到 CSV 文件。在这种情况下,你可能不必处理大内存,一个简单的printf就足够了。希望这段代码有所帮助。

#include <stdio.h>
int main()
{
        int i;

        struct a {
                char a;
                char b;
                char c;
                float f[10];
        };

        struct a my_struct;

        my_struct.a = 'a';
        my_struct.b = 'b';
        my_struct.c = 'c';

        for (i = 0; i < 10; i++)
                my_struct.f[i] = i * 1.1;

        printf("%c,%c,%c", my_struct.a, my_struct.b, my_struct.c);
        for (i = 0; i < 10; i++)
                printf(",%.8f", my_struct.f[i]);

        return 0;
}

输出

a,b,c,0.00000000,1.10000002,2.20000005,3.29999995,4.40000010,5.50000000,6.59999990,7.69999981,8.80000019,9.89999962
于 2013-09-17T10:10:48.550 回答