大家好,我是c的新手,这是我在StackOverFlows.com上的第一个答案,请很好:),
我真的不明白这种行为。
这是我的代码:
#include <stdio.h>
typedef struct record{
char nome[20];
enter code herechar cognome[30];
} rec ;
void main(){
rec p={"mario","rossi"};
FILE* f;
f=fopen("x.dat","w");
fwrite(&p,sizeof(rec),2,f);// i write 2 times mario rossi
fclose(f);
f=fopen("x.dat","r");
rec d[2];
fread(d,sizeof(rec),1,f);// pt1
fread(d,sizeof(rec),1,f);
printf("%s %s\n",d[0].nome,d[0].cognome);
printf("%s %s\n",d[1].nome,d[1].cognome);
fclose(f);
f=fopen("x.dat","r");
d[2];
fread(d,sizeof(rec),1,f);// pt2
fread(d+sizeof(rec),sizeof(rec),1,f); //pt3
printf("%s %s\n",d[0].nome,d[0].cognome);
printf("%s %s\n",d[1].nome,d[1].cognome);
fclose(f);
}
我想从文件中读写2个结构,然后将它们重定向到数组中
所以问题是:
为什么pt1行中的2个
fread
无法将结构存储在数组中?对我来说是个谜:为什么同一条指令指向pt2行
不失败?和pt3行失败???
在pt3行中,我发明了
d+sizeof(rec)
,因为我猜想指针算法我不知道这是否合法,但输出与pt1行相同
这个代码是错误的???
非常感谢您的帮助我:)
最佳答案
您所有的阅读实际上都有效,但是您没有阅读您认为正在阅读的内容,也没有将阅读的内容存储在您认为存储的位置。
传递给fwrite
的数字不是说要写入数据多少次,而是指示指针指向多少记录。
(也就是说,指针被认为指向数组中的第一个元素以及该数组包含多少个元素。)
逐行遍历您的代码,跳过最不感兴趣的位:
fwrite(&p,sizeof(rec),2,f);
这将写入“ mario rossi记录”,并且紧随其后的所有
sizeof(rec)
字节都会被存储。该数据可能看起来像随机垃圾。
rec d[2];
该数组的元素未初始化,可以包含任何内容。
在此阶段,读取其元素是不确定的。
fread(d,sizeof(rec),1,f);// pt1
这会将“ mario rossi记录”读入
d
的第一个元素。fread(d,sizeof(rec),1,f);
这会将“随机垃圾记录”读入
d
的第一个元素,从而替换“ mario rossi record”。第二个元素仍然包含未初始化的数据。
printf("%s %s\n",d[0].nome,d[0].cognome);
这将打印您先前编写的“随机垃圾记录”。
printf("%s %s\n",d[1].nome,d[1].cognome);
这将打印您从未替换过的未初始化数据。
d[2];
这条线什么也做不了。
fread(d,sizeof(rec),1,f);// pt2
这会将“ mario rossi记录”读入
d
的第一个元素。fread(d+sizeof(rec),sizeof(rec),1,f); //pt3
这会将“随机垃圾记录”读入
d
的第二个元素。printf("%s %s\n",d[0].nome,d[0].cognome);
这是您唯一输出任何有效数据的时间,这就是为什么它看起来可以正常工作的原因。
如果要编写两次“ mario rossi记录”,请编写两次:
fwrite(&p,sizeof(rec),1,f);
fwrite(&p,sizeof(rec),1,f);