大家好,我是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);

10-07 13:22