如果对fread()的调用返回0并且ferror()指示错误(相对于EOF),是否可以重试读取或是否更好地关闭并重新打开文件?
我无法完全重新开始 - 输入文件已被部分处理,无法撤消(比如我一次写出一个块到套接字,并且由于现有协议,没有办法告诉远程端,“没关系,我需要重新开始”) .
我可以fclose()和fopen()文件,fseek()超过已经处理过的数据,并从那里继续fread() - 但这是必要的吗?
没有"one size fits all"解决方案,因为不同的错误可能需要不同的处理 . 来自 fread() 的错误是不寻常的;如果您正确调用它,则错误可能表示情况已使 FILE* 处于奇怪的错误状态 . 在这种情况下,你最好调用 fclose() , fopen() , fseek() 来恢复状态 .
fread()
FILE*
fclose()
fopen()
fseek()
如果您发生了're coding for something that',请提及您从 ferror() 获得的实际错误...
ferror()
你可以看一下clearerr函数 .
您可以使用 perror() 或 strerror() 向用户显示错误,并询问她是否要重试 .
perror()
strerror()
但是,实现并不强制要求提供此类错误消息 . 在调用 fread() 之前,应将 errno 设置为0;如果失败且 errno 仍然为0,则不会有错误信息 .
errno
3 回答
没有"one size fits all"解决方案,因为不同的错误可能需要不同的处理 . 来自
fread()
的错误是不寻常的;如果您正确调用它,则错误可能表示情况已使FILE*
处于奇怪的错误状态 . 在这种情况下,你最好调用fclose()
,fopen()
,fseek()
来恢复状态 .如果您发生了're coding for something that',请提及您从
ferror()
获得的实际错误...你可以看一下clearerr函数 .
您可以使用
perror()
或strerror()
向用户显示错误,并询问她是否要重试 .但是,实现并不强制要求提供此类错误消息 . 在调用
fread()
之前,应将errno
设置为0;如果失败且errno
仍然为0,则不会有错误信息 .