输入文件夹名称时是否应该输出异常?

时间:2014-10-10 01:47:17

标签: c++ ofstream

我想通过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();
}
  • 如果参数filenameC:\\MyProject\\CodeTest2010\\CodeTest2010\\test.txt,则会成功创建test.txt文件。
  • 如果参数filenameC:\\MyProject\\CodeTest2010\\CodeTest2010\\C:\\MyProject\\CodeTest2010\\CodeTest2010,则文件夹CodeTest2010中不会更改任何内容。我认为应该抛出异常来警告输入文件名无效。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

  

如果无法打开文件,则会设置流的failbit标志。

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