我想通过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
文件。filename
为C:\\MyProject\\CodeTest2010\\CodeTest2010\\
或C:\\MyProject\\CodeTest2010\\CodeTest2010
,则文件夹CodeTest2010中不会更改任何内容。我认为应该抛出异常来警告输入文件名无效。我的问题是当输入文件不是文件名时,为什么它保持沉默而不是抛出异常?
根据this,我找不到有关文件夹名称的任何信息输入到ofstream中。
答案 0 :(得分:3)
默认情况下IOStreams不会抛出异常。相反,它们将错误指示委托给表示某些流错误的位掩码类型。无法打开文件被归类为可恢复的错误,因此它将std::ios_base::failtbit
设置为其流状态。您可以通过在exceptions()
方法的参数中指定此位来启用例外:
ofs.exceptions(std::ios_base::failbit);
答案 1 :(得分:2)
实际上,如果你点击构造函数的描述,你会看到:
如果无法打开文件,则会设置流的failbit标志。
iostreams的默认行为恰恰是这样:失败的操作不会抛出异常,但可以通过检查流状态位来检测。您可以安排流使用ios::exceptions
函数抛出失败操作的异常,尽管这不适用于构造函数(因为您必须在调用该函数之前构造流)。