我有一个结构,我想写一个常规文件作为一个记录,用逗号分隔的字段。例如
struct A {
int a;
int b;
} test;
鉴于test.a=1
和test.b = 2
,常规文件将具有相应的1,2
作为一行记录。另一个要求是,我想用一个系统调用来编写整个结构。所以,我创建了一个char buffer[10]
,将int a,b的值存储到缓冲区中,用逗号分隔和换行符,并使用Linux系统write()调用来写缓冲区。
问题是记录在文件中以二进制结尾。这是直观的,因为我带走了"类型"从变量中,我将它们存储在char数组中。我可以使用标准的io,但我想学习,如何通过标准的Linux系统调用以及概述的约束来实现预期的结果。我怎样才能保持" typness"一个变量。通过类型我的意思是,如果变量是int类型,则常规文件应该具有人类可读的数字。
答案 0 :(得分:5)
如果您使用fprintf(fh, "%d,%d\n", test.a, test.b);
打开输出文件,那么您要查看的内容类似于fopen
。如果您出于某种原因确实必须使用write()
,则可以sprintf(buffer, "%d,%d\n", test.a, test.b); write(fd, buffer, strlen(buffer));
。
答案 1 :(得分:2)
fprintf(fh, "struct:A{int:%d,int:%d}\n", test.a, test.b);
在某些环境中,您可以写:
fprintf(fh, "struct:%s{%s:%d,%s:%d}\n", typeid(A).name(), typeid(test.a).name(), test.a, typeid(test.b).name(), test.b);
答案 2 :(得分:1)
如果您希望文件是人类可读的,请使用fprintf,使用
等代码编写文件void writeArrayToFile(struct A* array, int count)
{
int i;
FILE* fp;
// open file
for (i=0; i<count; i++) {
fprintf(fp, "%d,%d\n", array[i].a, array[i].b);
}
fclose(fp);
}