Linux环境下调用fread返回0且无法读取已写入文件数据的问题
问题成因
- 完成
fwrite写入操作后,文件流的位置指针已经偏移到写入内容的末尾,此时直接调用fread会从文件末尾位置开始读取,自然无法读取到任何数据,返回值为0属于符合预期的行为,不存在系统错误因此perror输出成功提示。 - C语言标准明确要求,对同一文件流交替执行读写操作时,中间必须通过
fflush、文件定位函数(fseek/rewind/fsetpos)完成同步,否则操作行为是未定义的,你的代码没有做这一步切换同步,也会导致读取异常。
修复方案
在fwrite执行完成后、fread调用前,添加文件指针重置的代码即可,两种常用实现方式二选一:
- 调用
rewind(fp)直接把文件指针重置到文件起始位置 - 调用
fseek(fp, 0, SEEK_SET)手动将指针偏移到文件起始位置
修复后的核心代码片段
num = fwrite(wr_buf , 1 , sizeof(wr_buf) , fp); printf("WR num %zu\n", num); // 补充:size_t类型建议用%zu格式化输出,避免64位环境下类型不匹配警告 // 新增指针重置代码 rewind(fp); num = fread(rd_buf , 1 , sizeof(rd_buf) , fp); printf("RD num %zu\n", num); perror("fread");
内容的提问来源于stack exchange,提问作者user14104726
相关产品推荐
相关产品推荐

