如果对 fread() 的调用返回 0 并且 ferror() 指示错误(相对于 EOF),是否可以重试读取,还是关闭并重新打开文件更好?
我不能完全重新开始——输入文件已经以一种无法撤消的方式进行了部分处理(比如我一次将一个块写入一个套接字,并且由于现有协议,没有办法告诉远端,“没关系,我需要重新开始”)。
我可以 fclose() 和 fopen() 文件, fseek() 过去已处理的数据,然后从那里继续 fread()-ing,但这一切是否必要?
如果对 fread() 的调用返回 0 并且 ferror() 指示错误(相对于 EOF),是否可以重试读取,还是关闭并重新打开文件更好?
我不能完全重新开始——输入文件已经以一种无法撤消的方式进行了部分处理(比如我一次将一个块写入一个套接字,并且由于现有协议,没有办法告诉远端,“没关系,我需要重新开始”)。
我可以 fclose() 和 fopen() 文件, fseek() 过去已处理的数据,然后从那里继续 fread()-ing,但这一切是否必要?
没有“一刀切”的解决方案,因为不同的错误可能需要不同的处理。错误fread()
是不寻常的;如果您正确调用它,则错误可能表明情况已使FILE*
处于奇怪的错误状态。在这种情况下,您最好调用fclose()
,来让事情恢复到良好状态。fopen()
fseek()
如果您正在为正在发生的事情进行编码,请提及您从中获得的实际错误ferror()
......
你可以clearerr
看看这个函数。
perror()
您可以使用or向用户显示错误,strerror()
并询问她是否要重试。
但是,实现提供这样的错误消息并不是强制性的。您应该errno
在调用之前设置为 0 fread()
;如果失败并且errno
仍然为 0,那么将没有可用的错误信息。