【问题标题】:Reading and writing structure to binary file in C, then print structure elements在C中读取和写入结构到二进制文件,然后打印结构元素
【发布时间】:2019-05-16 17:26:33
【问题描述】:

我想在程序 A 中将结构写入二进制文件,然后在程序 B 中读取它,然后将结构打印出来。但是,我得到的输出不正确。

我在程序 A 中尝试了 fwrite,在程序 B 中尝试了 fread,然后使用 printf 打印了输出,只是得到了一串无意义的数字。

程序 A:

  #include <stdio.h>
  #include <stdlib.h>

  struct record
  {
    int index;
    char name [100];
    int age;
  };

  int main ()
  {
     struct record *one=malloc(sizeof(struct record));
     FILE *in=fopen("records.bin", "ab+")l

     fgets(one->name, 100, stdin);
     one->index=100;
     one->age=50;

     fwrite(&one, sizeof(struct record), 1, in);
     fclose(in);
  }

程序B(所有头和结构相同,代码如下):

  int main ()
  {

     FILE *in=fopen("records.bin", "rb+");

     struct record array;

     fread (&array, sizeof(struct record), 1, in);
     printf ("%d\n", array.index);
     printf ("%s\n", array.name);
     printf ("%d\n", array.age);

     fclose(in);

  }

我希望输出是

100
j
50

但实际输出的是172400800

【问题讨论】:

  • 请注意,此方法不可移植。如果两个程序都使用相同的编译器在相同的平台上使用相同的设置进行编译,这将起作用。但在其他条件下可能不起作用。这是因为对于每两个平台/编译器组合,struct 和数字表示(填充、字节顺序等)不一定相同。

标签: c data-structures


【解决方案1】:

您正在向文件中写入垃圾,因为您使用的是指针的指针,而不是指针。

所以你可以做一个快速修复:

fwrite(one, sizeof(struct record), 1, in);

或者您可以重写以避免分配,这可能是一个好主意,因为这里完全没有必要:

#include <stdio.h>
#include <stdlib.h>

struct record
{
  int index;
  char name [100];
  int age;
};

int main ()
{
  struct record one;

  FILE *in = fopen("records.bin", "ab+");

  fgets(one.name, 100, stdin);
  one.index=100;
  one.age=50;

  fwrite(&one, sizeof(struct record), 1, in);
  fclose(in);
}

作为补充说明,您确实应该转向具有内在含义的变量名称。 one 没有意义。 r 是一种改进,即使有些模棱两可,因为至少“r”意味着与“记录”相关的东西。

【讨论】:

  • 此外,模式ab+ 不是必需的:不需要读/写访问。
  • @PaulOgilvie 在这种情况下,不,但它可能是某种代码的一部分,最终会像数据库一样读/写。
  • 只有"wb" 是合适的,如果您正在处理旧系统,则只有"b"。新的自动将所有文件视为二进制文件,这就是它应该的方式。
猜你喜欢
  • 2015-06-28
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
相关资源
最近更新 更多