用C在二进制文件中读取和写入结构,然后打印结构元素

时间:2019-05-16 17:26:34

标签: c data-structures

我想在程序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

1 个答案:

答案 0 :(得分:3)

您将垃圾内容写入文件是因为您使用的是指针的指针,而不是指针。

因此您可以进行快速修复:

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”表示与“记录”相关的内容。