Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从fread()故障中恢复的好方法是什么?_C++_C_Error Handling_Recovery_Fread - Fatal编程技术网

C++ 从fread()故障中恢复的好方法是什么?

C++ 从fread()故障中恢复的好方法是什么?,c++,c,error-handling,recovery,fread,C++,C,Error Handling,Recovery,Fread,如果对fread()的调用返回0,而ferror()指示错误(相对于EOF),那么重试读取是否可以,还是关闭并重新打开文件更好 我不能完全从头开始——输入文件已经以一种无法撤消的方式进行了部分处理(比如说,我一次向套接字写入一个块,并且由于现有协议,无法告诉远程端,“没关系,我需要重新开始”) 我可以将文件fclose()和fopen()丢失,fseek()跳过已处理的数据,然后从那里继续fread()-ing,但这一切都是必要的吗?没有“一刀切”的解决方案,因为不同的错误可能需要不同的处理。来

如果对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清除错误。标准将此行为定义为可移植的操作。