从fread()失败中恢复的好方法是什么?

时间:2009-04-24 16:12:18

标签: c++ c error-handling recovery fread

如果对fread()的调用返回0并且ferror()指示错误(相对于EOF),是否可以重试读取或是否更好地关闭并重新打开文件?

我无法完全重新开始 - 输入文件已经以无法撤消的方式进行了部分处理(比如说我一次将一个块写入套接字,并且由于现有协议,没有办法告诉远端,“没关系,我需要重新开始”。)

我可以fclose()和fopen()文件,fseek()超过已经处理过的数据,然后从那里继续fread() - 但这是必要的吗?

3 个答案:

答案 0 :(得分:6)

没有“一刀切”的解决方案,因为不同的错误可能需要不同的处理。来自fread()的错误是不寻常的;如果您正确调用它,则错误可能表示情况已使FILE*处于奇怪的错误状态。在这种情况下,您最好调用fclose()fopen()fseek()来恢复状态。

如果您正在为正在发生的事情编写代码,请提及您从ferror()获得的实际错误...

答案 1 :(得分:6)

您可以查看clearerr功能。

答案 2 :(得分:0)

您可以使用perror()strerror()向用户显示错误,并询问她是否要重试。

但实现并不强制要求提供此类错误消息。在调用errno之前,您应该将fread()设置为0;如果失败并且errno仍为0,则不会有错误信息。