问题描述
|
我正在尝试在C ++中尝试尝试,捕获和引发语句以进行文件处理,并且我编写了一个伪代码来捕获所有错误。我的问题是为了检查我是否正确,我需要发生错误。现在,我只需在目录中不创建所需名称的文件即可轻松地检查“ 0”。但是我将如何检查
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;
}
解决方法
Linux上的
open(2)
手册页包含大约30个条件。一些有趣的是:
如果文件存在并且您没有写权限。
如果该文件不存在,并且您没有权限(在目录中)创建该文件。
如果您没有对某些父目录的搜索权限。
如果您输入假冒“ 9”作为文件名。
如果在打开设备文件时按CTRL-C。
如果内核在解析名称时遇到太多符号链接。
如果您尝试打开一个目录进行写入。
如果路径名太长。
如果您的进程中有太多文件已打开。
如果系统中打开的文件太多,则已经打开。
如果路径名指向设备文件,并且系统中没有此类设备。
如果内核内存不足。
文件系统是否已满。
如果路径名的组成部分不是目录。
如果文件在只读文件系统上。
如果文件是当前正在执行的可执行文件。
,默认情况下,按照设计,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
}
,要使ѭ12失败,您需要安排使其无法创建命名文件。最简单的方法是在运行程序之前创建一个完全相同名称的目录。这是一个几乎完整的演示程序;当并且仅当您创建测试目录时,才安排可靠地删除测试目录,我作为练习离开。
#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。