如果对fread()的调用返回0,并且ferror()指示错误(对EOF),那么可以重试读取还是关闭并重新打开文件更好?从fread()失败中恢复的好方法是什么?
我不能完全重新开始 - 输入文件已经被部分处理,不能被撤销(比如说我一次写出一个块到一个套接字,并且由于现有的协议,没有办法告诉远端,“没关系,我需要重新开始”)。我可以fclose()和fopen()文件,fseek()过去已经处理过的数据,并从那里继续fread(),但是这些都是必要的吗?
如果对fread()的调用返回0,并且ferror()指示错误(对EOF),那么可以重试读取还是关闭并重新打开文件更好?从fread()失败中恢复的好方法是什么?
我不能完全重新开始 - 输入文件已经被部分处理,不能被撤销(比如说我一次写出一个块到一个套接字,并且由于现有的协议,没有办法告诉远端,“没关系,我需要重新开始”)。我可以fclose()和fopen()文件,fseek()过去已经处理过的数据,并从那里继续fread(),但是这些都是必要的吗?
没有“一刀切”的解决方案,因为不同的错误可能需要不同的处理。来自fread()
的错误是不寻常的;如果您正确调用它,则错误可能表示已使FILE*
处于奇怪错误状态的情况。在这种情况下,您最好拨打fclose()
,fopen()
,fseek()
以使事情恢复到良好的状态。
如果你编码的东西是怎么回事,请注明你从ferror()
得到实际的错误...
,您可以给clearerr
功能看看。
好点。如果我想在不关闭/打开文件的情况下重试fread(),则需要先清除()。 – Dan 2009-04-24 17:04:24
FWIW,如果你想在错误发生后读取流,你需要使用clearerr清除错误。这种行为被标准定义为便携式的事情。 – dirkgently 2009-04-24 17:10:48
+1,希望我首先想到它;) – dwc 2009-04-24 19:30:18
您可以使用perror()
或strerror()
向用户显示错误,并询问她是否要重试。
尽管如此,实现并不强制提供这样的错误消息。在致电fread()
之前,您应该将errno
设置为0;如果失败并且errno
仍然为0,则不会有错误信息可用。
如何判断fread()发生了什么样的错误?我不认为errno被设置(至少不符合C标准)。 fread()被正确调用,问题出在底层文件系统上。 – Dan 2009-04-24 17:01:47
ferror()在出错时返回非零值。使用该结果来检查特定的错误,或者将其转交给perror()/ strerror来查看你所得到的结果。 – dwc 2009-04-24 17:06:38