C++ 从fread()故障中恢复的好方法是什么?
如果对fread()的调用返回0,而ferror()指示错误(相对于EOF),那么重试读取是否可以,还是关闭并重新打开文件更好 我不能完全从头开始——输入文件已经以一种无法撤消的方式进行了部分处理(比如说,我一次向套接字写入一个块,并且由于现有协议,无法告诉远程端,“没关系,我需要重新开始”) 我可以将文件fclose()和fopen()丢失,fseek()跳过已处理的数据,然后从那里继续fread()-ing,但这一切都是必要的吗?没有“一刀切”的解决方案,因为不同的错误可能需要不同的处理。来自C++ 从fread()故障中恢复的好方法是什么?,c++,c,error-handling,recovery,fread,C++,C,Error Handling,Recovery,Fread,如果对fread()的调用返回0,而ferror()指示错误(相对于EOF),那么重试读取是否可以,还是关闭并重新打开文件更好 我不能完全从头开始——输入文件已经以一种无法撤消的方式进行了部分处理(比如说,我一次向套接字写入一个块,并且由于现有协议,无法告诉远程端,“没关系,我需要重新开始”) 我可以将文件fclose()和fopen()丢失,fseek()跳过已处理的数据,然后从那里继续fread()-ing,但这一切都是必要的吗?没有“一刀切”的解决方案,因为不同的错误可能需要不同的处理。来
fread()
的错误是不寻常的;如果调用正确,则错误可能表明文件*
处于异常错误状态。在这种情况下,最好调用fclose()
,fopen()
,fseek()
,以恢复良好状态
如果您正在为正在发生的事情编写代码,请说明您从
ferror()
中得到的实际错误。您可以查看函数。您可以使用perror()
或strerror()
向用户显示错误,并询问她是否要重试
不过,对于实现来说,提供这样的错误消息并不是强制性的。在调用
fread()
之前,应将errno
设置为0;如果失败并且errno
仍然为0,则没有可用的错误信息。如何判断fread()发生了何种错误?我认为不会设置errno(至少根据C标准不会设置)。正确调用fread(),问题在于底层文件系统。错误时,ferror()返回非零。使用该结果检查特定错误,或将其交给perror()/strerror查看您得到了什么。这一点很好。如果我想在不关闭/打开文件的情况下重试fread(),我需要先清除err()first.FWIW,如果你想在错误发生后读取流,你需要使用clearr清除错误。标准将此行为定义为可移植的操作。