【问题标题】:Error handling in std::ofstream while writing data写入数据时 std::ofstream 中的错误处理
【发布时间】:2015-02-05 11:23:10
【问题描述】:

我有一个小程序,我在其中初始化一个字符串并写入文件流:

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
  std::ofstream ofs(file.c_str());
  string s="Hello how are you";
  if(ofs)
     ofs<<s;
  if(!ofs)
  {
       cout<<"Writing to file failed"<<endl;
  }
  return 0;
 }

我的磁盘空间非常少,“ofs”语句失败。所以我知道这在逻辑上是一个错误。

语句 "if(!ofs)" 没有遇到上述问题,因此我无法知道它失败的原因。

请告诉我,通过哪些其他选项我可以知道 "ofs 失败了。

提前致谢。

【问题讨论】:

  • 在尝试ofs &lt;&lt; 之前,您是否检查过ofstream 是否实际上已打开?
  • ofstream::operator&lt;&lt; 如果失败,将修改内部状态标志。你查过ofstream::eof/bad/fail吗?
  • @zenith:如果无法打开文件,内部状态标志将会改变。你能在写作时确认它是否也失败了吗?如果可能,请您出示一些代码。
  • 检查返回值部分here。这能回答你的问题吗?
  • @zenith ofstream::operator&lt;&lt; 在尝试写入数据时如果出现写入错误将失败。由于缓冲,这通常不会发生在失败的输出操作上。 通常,在close之后验证ofstream的状态就足够了(当保证所有数据都被刷新时);如果需要及时检查,则必须先刷新流。

标签: c++ ofstream


【解决方案1】:

原则上,如果出现写入错误,应该设置badbit。这 错误只会在流实际尝试写入时设置,但是, 所以由于缓冲,它可能会设置在比错误发生时更晚的写入时间,甚至是在发生错误之后 关闭。并且位是“粘性的”,所以一旦设置,它将保持 设置。

鉴于上述情况,通常的程序只是验证 关闭后输出;输出到std::coutstd::cerr时,后 最后的冲洗。比如:

std::ofstream f(...);
//  all sorts of output (usually to the `std::ostream&` in a
//  function).
f.close();
if ( ! f ) {
    //  Error handling.  Most important, do _not_ return 0 from
    //  main, but EXIT_FAILUREl.
}

输出到std::cout时,将f.close()替换为 std::cout.flush()(当然还有if ( ! std::cout ))。

AND:这是标准程序。返回码为 0 的程序 (或EXIT_SUCCESS)出现写入错误时不正确。

【讨论】:

  • 您关于 EXIT_FAILURE 的声明是否意味着程序在写入错误后继续运行是不安全的?我应该认为这是不安全的,但我只是想更加确定。
  • @batbrat 不。他的意思是当出现问题时,程序不应该返回0成功)。
  • @n.caillou 好点。当问题发生时,我们可以返回成功,当且仅当我们已经完全处理了它,对吧?
  • 但是我们如何才能获得有关写入失败原因的有用信息?
【解决方案2】:

我找到了类似的解决方案

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
  std::ofstream ofs(file.c_str());
  string s="Hello how are you";
  if(ofs)
     ofs<<s;
  if(ofs.bad())    //bad() function will check for badbit
  {
       cout<<"Writing to file failed"<<endl;
  }
  return 0;
 }

您也可以参考以下链接herethere来检查正确性。

【讨论】:

  • 如果这行得通,我会感到非常惊讶。您必须关闭流或刷新它才能检测到错误。
  • 当大量输入写入缓冲区时,是否有可能刷新流?在这种情况下,这可能是值得添加的检查,以便程序可以在发现错误后立即终止。
  • if (ofs) 有什么作用?我希望该条件始终为真,因为 ofs 是堆栈上的一个对象。
  • @jvriesem 可能有点晚了,但是在构造函数“std::ofstream ofs(file.c_str())”中无法创建文件的情况下,对象将为空这就是在 if 中检查的内容
  • bad() 只会检查 badbit,为什么不检查 fail()?它正在同时检查 badbit 或 failbit。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多