将float数组转换为char缓冲区

时间:2013-09-17 09:55:03

标签: c

我有一个结构:

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

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

所以,如果我现在将我的浮点数组转换为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期间在字符串末尾添加'\0',所以下一个snprintf(循环结束后的那个)在满足{{1}之后完成1}} - 来自'arr'的第一个值。如何使它工作?

问候 学家

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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