如何以二进制格式不写()

时间:2013-01-14 16:55:28

标签: c linux

我有一个结构,我想写一个常规文件作为一个记录,用逗号分隔的字段。例如

    struct A {
      int a;
      int b;
   } test;

鉴于test.a=1test.b = 2,常规文件将具有相应的1,2作为一行记录。另一个要求是,我想用一个系统调用来编写整个结构。所以,我创建了一个char buffer[10],将int a,b的值存储到缓冲区中,用逗号分隔和换行符,并使用Linux系统write()调用来写缓冲区。

问题是记录在文件中以二进制结尾。这是直观的,因为我带走了"类型"从变量中,我将它们存储在char数组中。我可以使用标准的io,但我想学习,如何通过标准的Linux系统调用以及概述的约束来实现预期的结果。我怎样才能保持" typness"一个变量。通过类型我的意思是,如果变量是int类型,则常规文件应该具有人类可读的数字。

3 个答案:

答案 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);
}