C程序,用fwrite()写入文件后,再读出,发现多写了最后一条记录.求解正常程序.

C程序,用fwrite()写入文件后,再读出,发现多写了最后一条记录.求解正常程序.,第1张

原因:feof(file) 的作用是检测读取到的数据是否为文件结束。读完最后一行记录后,file->_flag 没有被置为_IOEOF,因为已经读取到记录了, feof() 没有探测到文件结尾。直到再次调用 fread()读取记录时,才获取文件结束标志,feof() 探测到文件结尾。

当再次调用 fread(&myttt,sizeof(ttt),1,file)时,myttt 没有获取任何内容,还是上次亮衫贺读取的数据,输出时,当然是跟上次一样。

修改如下:

void readFile(int *n)

{

FILE *file=fopen("wmx.dat","r")

ttt myttt

if(file==NULL)

{

printf("打开文件失败.\n")

exit(0)

}

/敬派/ 检测文件长度,如果大于 0,先读取一行。

if(file->_bufsiz>0)

{

fread(&myttt,sizeof(ttt),1,file)

}

while(!feof(file)) //此处打印的塌羡最结果是11条记录.

{

printf("%d %d %s\n",myttt.ele1,myttt.ele2,myttt.ch)

// 当读取完数据后,读取出文件结束标志,

// 回到 while 时,就不再输出下一行了。

fread(&myttt,sizeof(ttt),1,file)

}

fclose(file)

}

if((fp=fopen("source.txt","wb"))==NULL)表示你采用的是穗困二进制的形式来写入文件

同理

fp=fopen("source.txt","rb")/*打开文件source.txt*/

表示你用饥返二进制的形式烂族饥来读取文件

使用二进制形式读取或写入文件,文件采用的是二进制形式保存,采用记事本打开后会出现乱码。

fwrite(&k,sizeof(int),1,fp)

k 是记录的个数,

本句是在文件中“第一个字”写入 一整形数标判敏记了本文件中总的记录的个数

是在第一个字位置,当然不可以放到文件尾,在读如程序部分,首先读出该整形

在void loaddate() 中

fread(&k,sizeof(int),1,fp) //读取之前成功写入的次数k。

如果将 k write 到 文件尾 ,失去了意义,并缓野且读出程序也需要修改

读出程序如果不能在开始判断出记录的个掘哪枝数,必须一次次检测直到读出遇到文件尾或是失败

不记录k 也可以家解决读取个数在读取前知道的问题

loaddate()中 使用

fseek(fp,0,SEEK_END)

long L=ftell(fp)

k=L/sizeof(cz)

fseek(fp,0,SEEK_SET)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12208527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存