3

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

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

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

4

3 回答 3

6

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

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

于 2009-04-24T16:20:31.720 回答
6

你可以clearerr看看这个函数。

于 2009-04-24T16:23:10.340 回答
0

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

但是,实现提供这样的错误消息并不是强制性的。您应该errno在调用之前设置为 0 fread();如果失败并且errno仍然为 0,那么将没有可用的错误信息。

于 2009-04-24T16:46:43.620 回答