我有一个结构:
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'的第一个值。如何使它工作?
问候 学家
答案 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