结构体存储到文件里,fread读取错误,总是乱码 你写完文件后,没有关闭文件,导致后面读文件的时候无法打开文件。我修改了下,可以正常读取了includeincludetypedef struct{char*CardCode;char*Name;char*Contact;char*Password;char AccountType;double MoneyCount;}*AccountRecord,AccountInfo;int AccountInfoWrite(AccountInfo Record){FILE*fp;char*FileName=\"12345678.Bq;FileName=stringjoin(Record.CardCode,\".Bq\");if(fopen_s(&fp,FileName,\"w\")。0){printf(\"文件已新建。\\n\");return 1;}if(fwrite(&Record,sizeof(AccountInfo)+1,1,fp)=1){printf(\"账户信息写入成功!\\n\");fclose(fp);return 0;}else{printf(\"账户信息写入失败!\\n\");return 1;}return 0;}void read(){AccountInfo buffer;FILE*fp;int errorcode=fopen_s(&fp,\"12345678.Bq\",\"rb\");if(0。errorcode){printf(\"open file error:%d。\\n\",errorcode);return;}fread(&buffer,sizeof(AccountInfo),1,fp);fclose(fp);printf(\"%s \\n\",buffer.Name);}int main(){AccountRecord a=(AccountRecord)malloc(sizeof(AccountRecord));a->;Name=\"aassasasa;a->;CardCode=\"12345678;a->;Contact=\"110;a->;Password=\"112233;a->;。

C语言fread为什么会读取失败呢? 文件读取时,FILE*指向一个结构,里面有个指针指向硬盘上f.txt的某个位置。刚刚用\"r\"为参数调用fopen时,该指针指向f.txt的开头。然后每读取一个字节,该指针都会忘f.txt的末尾移动。移动到最后就变成EOF(End Of File)了。当整个文件的内容都被你读完,也就是说指针已经指向f.txt的最末尾了,那时任何类型的文件读取都会失败(除非你fclose后再度fopen)。fscanf(fp,\"%s\"模式,读取从当前位置开始直到不可见字符(空格、制表符、换行符)为止。如果f.txt里所有内容都连在一起,光执行一次fscanf(fp,\"%s\"模式,所有f.txt都会被读光,fp就指向f.txt的最末尾了。所以你想解决这个问题,唯一的办法就是把数据写入f.txt时,每个数据后面都跟上一个空格或回车。比如fprintf(fp,\"%s\",.)或者fprintf(fp,\"%d\",.)嫌麻烦的话也可以for(i=0;i;i+)fprintf(fp,\"%s%d%d%d\\n\",info[i].name,info[i].math,info[i].Chinese,info[i].English);这样。

关于fread读取数据时指针的位置问题 这个r我一般是用来检测文件的,fread这个函数的返回值就是它读取了几次的值,在你这里fread返回值为1,所以r的值应该是1,如果r值为0,那么就代表读取错误,一般来说就是文件读取完了。可以把r=fread(&dat,sizeof(dat),1,f)作为if语句括号内的表达式。我习惯用这种方式来检测文件指针是否到了文件末尾。最后一条数据输出2次这个问题我也遇到过,是检测文件是否到末尾的问题,我用while!feof(fp))就会出现这种问题,应该是判断文件指针是否到文件末尾出现错误了,具体原因我也不清楚,不过很容易解决,就是利用类似楼上的r的方式。while(1){if(fread(&A,sizeof(struct employee),1,fp)。1)break;}直接用fread的返回值判断比较准确,用判断指针的方式有问题。文件指针是移动一个字节再读取一个字节,当读取完一个结构体之后,文件指针指向该结构体最后一个字节,只有进行下次读取时,文件指针才会移动,所以当读取完文件中最后一个结构体,文件指针指向的是最后一个结构体的最后一个字节,而不是文件末尾—这就像字符数组,最后一个字母不是末尾,末尾是\\0。所以读取完文件中最后一个结构体后,文件指针去没有移动到文件末尾。这样while的循环体就要多执行。