我正在尝试使用C ++进行try,catch,throw语句处理文件,我编写了一个虚拟代码来捕获所有错误。我的问题是为了检查我是否有这些权利,我需要发生错误。现在,我可以通过简单地不在目录中创建所需名称的文件来轻松检查infile.fail()
。但是,我如何才能为outfile.fail()
检查相同内容(outfile
为ofstream
,其中infile
为ifstream
。在这种情况下,outfile.fail()
的值是否为真?
示例代码[来自对unapersson的回答的评论,简化为使问题更清晰-zack]:
#include <fstream>
using std::ofstream;
int main()
{
ofstream outfile;
outfile.open("test.txt");
if (outfile.fail())
// do something......
else
// do something else.....
return 0;
}
答案 0 :(得分:26)
Linux上的open(2)
手册页有大约30个条件。一些有趣的是:
char*
作为文件名。答案 1 :(得分:6)
默认情况下,按照设计,C ++流永远不会在出错时抛出异常。您不应该尝试编写假定它们的代码,即使可以使用它们。相反,在您的应用程序逻辑中检查每个I / O操作是否有错误并处理它,如果在代码中出现的特定位置无法处理该错误,可能会抛出您自己的异常。
测试流和流操作的规范方法不是测试特定的流标志,除非必须这样做。代替:
ifstream ifs( "foo.txt" );
if ( ifs ) {
// ifs is good
}
else {
// ifs is bad - deal with it
}
类似于读取操作:
int x;
while( cin >> x ) {
// do something with x
}
// at this point test the stream (if you must)
if ( cin.eof() ) {
// cool - what we expected
}
else {
// bad
}
答案 2 :(得分:4)
要让ofstream::open
失败,您需要安排创建指定文件。最简单的方法是在运行程序之前创建一个完全相同名称的目录。这是一个几乎完整的演示程序;当且仅当你创建测试目录时,安排可靠地删除测试目录,我将其留作练习。
#include <iostream>
#include <fstream>
#include <sys/stat.h>
#include <cstring>
#include <cerrno>
using std::ofstream;
using std::strerror;
using std::cerr;
int main()
{
ofstream outfile;
// set up conditions so outfile.open will fail:
if (mkdir("test.txt", 0700)) {
cerr << "mkdir failed: " << strerror(errno) << '\n';
return 2;
}
outfile.open("test.txt");
if (outfile.fail()) {
cerr << "open failure as expected: " << strerror(errno) << '\n';
return 0;
} else {
cerr << "open success, not as expected\n";
return 1;
}
}
没有好办法确保写入到fstream失败。如果我需要测试,我可能会创建一个写入失败的模拟ostream。