【问题标题】:What is a good way to recover from a fread() failure?从 fread() 失败中恢复的好方法是什么?
【发布时间】:2009-04-24 16:12:18
【问题描述】:

如果对 fread() 的调用返回 0 并且 ferror() 指示错误(相对于 EOF),是否可以重试读取,还是关闭并重新打开文件更好?

我无法完全重新开始 - 输入文件已被部分处理,无法撤消(假设我一次将一个块写入套接字,并且由于现有协议,无法告诉远端,“没关系,我需要重新开始”)。

我可以 fclose() 和 fopen() 文件,fseek() 过去已经处理的数据,然后从那里继续 fread()-ing,但这一切都需要吗?

【问题讨论】:

    标签: c++ c error-handling recovery fread


    【解决方案1】:

    没有“一刀切”的解决方案,因为不同的错误可能需要不同的处理。来自fread() 的错误是不寻常的;如果您正确调用它,则错误可能表明FILE* 处于奇怪的错误状态。在这种情况下,您最好致电fclose()fopen()fseek() 以使事情恢复正常。

    如果您正在为正在发生的事情编写代码,请提及您从ferror()...得到的实际错误...

    【讨论】:

    • 如何判断 fread() 发生了什么样的错误?我不认为 errno 被设置(至少不是根据 C 标准)。 fread() 被正确调用,问题出在底层文件系统上。
    • ferror() 出错时返回非零值。使用该结果检查特定错误或移交给 perror()/strerror 以查看您得到的结果。
    【解决方案2】:

    你可以看看clearerr函数。

    【讨论】:

    • 好点。如果我想在不关闭/打开文件的情况下重试 fread(),我需要先 clearerr()。
    • FWIW,如果您想在错误后读取流,您需要使用 clearerr 清除错误。这种行为被标准定义为可移植的事情。
    【解决方案3】:

    您可以使用perror()strerror() 向用户显示错误并询问她是否要重试。

    不过,实现并不是必须提供这样的错误消息。你应该在调用fread()之前将errno设置为0;如果失败且errno 仍为 0,则不会提供任何错误信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2015-03-25
      • 1970-01-01
      相关资源
      最近更新 更多