【问题标题】:Should ofstream throw exception when folder name is input?输入文件夹名称时,ofstream应该抛出异常吗?
【发布时间】:2014-10-10 01:47:17
【问题描述】:

我想通过ofstream生成文件,代码如下。

void testOfstream(string filename){
    ofstream ofs(filename, ofstream::out | ofstream::trunc | ofstream::binary);

    char body[] = { 'a', 'b', 'c' };

    ofs.write(body, sizeof(body)/sizeof(char));

    ofs.close();
}
  • 如果filename参数为C:\\MyProject\\CodeTest2010\\CodeTest2010\\test.txt,则test.txt文件创建成功。
  • 如果参数filenameC:\\MyProject\\CodeTest2010\\CodeTest2010\\C:\\MyProject\\CodeTest2010\\CodeTest2010,则文件夹CodeTest2010 中没有任何更改。我认为它应该抛出异常来警告输入文件名无效。

我的问题是当输入文件是文件夹而不是文件名时,为什么它保持沉默而不是抛出异常?

根据this,我没有找到任何有关文件夹名称的信息输入到ofstream中。

【问题讨论】:

  • 流默认不会抛出异常cplusplus.com/reference/ios/ios/exceptions
  • 我不同意这里应该抛出异常。当您打开一个文件时,如果它是一个文件夹而不是普通文件,您预计它会失败。在我看来,这并不是真正的异常。您应该始终检查文件是否正确打开。如果没有,那么您可以报告错误并返回错误标志。我认为应该为意外的、难以从错误中恢复的异常保留异常。

标签: c++ ofstream


【解决方案1】:

默认情况下,IOStreams 不会抛出异常。相反,它们将错误指示委托给表示某些流错误的位掩码类型。无法打开文件被归类为可恢复错误,因此它将std::ios_base::failtbit 设置为其流状态。您可以通过在exceptions() 方法的参数中指定该位来启用异常:

ofs.exceptions(std::ios_base::failbit);

【讨论】:

  • 边缘情况:Filebufs 以fopen 的形式打开。尝试使用 libc 的 fopen 实现打开目录在只读模式下不会失败(至少在 osx 上不会),并且流中没有设置任何错误位。但是,无论流是否启用了异常(至少使用 libstdc++),只要尝试从 dir 读取,filebuf 就会抛出一个不相关的异常
  • @user657267 很有趣。著名的。 :)
【解决方案2】:

实际上,如果您单击构造函数的描述,您会看到:

如果文件无法打开,则设置流的失败位标志。

iostreams 的默认行为正是这样:失败的操作不会抛出异常,但可以通过检查流状态位来检测。您可以使用ios::exceptions 函数安排流在操作失败时引发异常,但这不适用于构造函数(因为您必须先构造流才能调用该函数)。

【讨论】:

  • 构造后可以直接调用exceptions(),如果可以的话还是会抛出异常。
猜你喜欢
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 2011-10-13
  • 2010-11-28
  • 2017-09-05
  • 2014-05-02
相关资源
最近更新 更多