C 如何在文件中写入完整结构?

C 如何在文件中写入完整结构?,c,C,在我的程序中,我接收来自键盘的输入。我将该输入放入一个struct,其中包含两个char字段和一个int字段。如何仅使用函数写入整个struct 我不想单独写入结构的每个成员。C没有“指令” 您应该能够使用单个函数调用,例如: fwrite(&mystructure, sizeof mystructure, 1, myfile); 但这并非没有缺点: 这使得文件格式取决于您当前的CPU和编译器,这通常是一个坏主意;这将使维护互操作性变得非常困难 写作可能部分成功;在这种情况下,你需要把

在我的程序中,我接收来自键盘的输入。我将该输入放入一个
struct
,其中包含两个
char
字段和一个
int
字段。如何仅使用函数写入整个
struct

我不想单独写入
结构的每个成员。

C没有“指令”

您应该能够使用单个函数调用,例如:

fwrite(&mystructure, sizeof mystructure, 1, myfile);
但这并非没有缺点:

  • 这使得文件格式取决于您当前的CPU和编译器,这通常是一个坏主意;这将使维护互操作性变得非常困难
  • 写作可能部分成功;在这种情况下,你需要把它包装成一个循环

  • 这取决于如何定义
    结构
    ,是否希望输出具有可读性,以及是否要在不同的体系结构上读取输出文件

    其他人给出的
    fwrite
    解决方案将把结构的二进制表示形式写入输出文件。例如,给定以下代码:

    #include <stdio.h>
    
    int main(void)
    {
      struct foo {
        int x;
        char name1[10];
        char name2[10];
      } items[] = {{1,"one","ONE"}, {2,"two","TWO"}};
    
      FILE *output = fopen("binio.dat", "w");
    
      fwrite( items, sizeof items, 1, output );
    
      fclose( output );
      return 0;
    }
    
    整数值显示为垃圾(上面没有复制),因为它们被存储为字节序列01、00、00、00和02、00、00、00(x86是小尾端),这是不可打印的字符。还请注意,
    name1
    的所有10个字符和
    name2
    的所有20个字符都会写入文件,这可能是您想要的,也可能不是您想要的

    如果结构包含指针,情况会变得更加复杂,因为存储到文件中的是指针值,而不是指向的对象:

    #include <stdio.h>
    
    int main(void)
    {
      struct foo {
        int x;
        char *name1;
        char *name2;
      } items[] = {{1,"one","ONE"}, {2,"two","TWO"}};
    
      FILE *output = fopen("binio.dat", "w");
    
      fwrite( items, sizeof items, 1, output );
    
      fclose( output );
      return 0;
    }
    
    但最后,这是最简单的


    如果您不关心可读性和可移植性,
    fwrite
    解决方案效果很好,但是如果结构中有任何指针成员,您仍然需要小心

    不清楚你在问什么。你能为你的问题添加一些代码,这样我们就能更好地理解它吗?只需将结构指针传递给指令。你不需要写会员。我稍后会补充,现在我只能使用智能手机上网
    #include <stdio.h>
    
    int main(void)
    {
      struct foo {
        int x;
        char *name1;
        char *name2;
      } items[] = {{1,"one","ONE"}, {2,"two","TWO"}};
    
      FILE *output = fopen("binio.dat", "w");
    
      fwrite( items, sizeof items, 1, output );
    
      fclose( output );
      return 0;
    }
    
    john@marvin:~/Development/Prototypes/C/binio$ cat binio.dat ��������john@marvin:~/Development/Prototypes/C/binio$ john@marvin:~/Development/Prototypes/C/binio$ od -c binio.dat 0000000 001 \0 \0 \0 260 205 004 \b 264 205 004 \b 002 \0 \0 \0 0000020 270 205 004 \b 274 205 004 \b 0000030
    #include <stdio.h>
    
    int main(void)
    {
      struct foo {
        int x;
        char *name1;
        char *name2;
      } items[] = {{1,"one","ONE"}, {2,"two","TWO"}};
    
      FILE *output = fopen("binio.dat", "w");
      int i;
      for (i = 0; i < sizeof items / sizeof items[0]; i++)
      {
        fprintf(output, "%d %s %s\n", items[i].x, items[i].name1, items[i].name2);
      }
      fclose( output );
      return 0;
    }
    
    john@marvin:~/Development/Prototypes/C/binio$ cat binio.dat 1 one ONE 2 two TWO
    int printFoo( FILE *output, const struct foo item )
    {
      return fprintf( output, "%d %s %s\n", item.x, item.name1, item.name2);
    }