我想在程序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
答案 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”表示与“记录”相关的内容。