什么时候ofstream :: open会失败?

时间:2011-04-29 18:25:39

标签: c++

我正在尝试使用C ++进行try,catch,throw语句处理文件,我编写了一个虚拟代码来捕获所有错误。我的问题是为了检查我是否有这些权利,我需要发生错误。现在,我可以通过简单地不在目录中创建所需名称的文件来轻松检查infile.fail()。但是,我如何才能为outfile.fail()检查相同内容(outfileofstream,其中infileifstream。在这种情况下,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; 
}

3 个答案:

答案 0 :(得分:26)

Linux上的open(2)手册页有大约30个条件。一些有趣的是:

  • 如果文件存在且您无权编写该文件。
  • 如果该文件不存在,并且您没有权限(在diretory上)来创建它。
  • 如果您对某些父目录没有搜索权限。
  • 如果您传入虚假文件char*作为文件名。
  • 如果在打开设备文件时按CTRL-C。
  • 如果内核在解析名称时遇到太多符号链接。
  • 如果您尝试打开目录进行书写。
  • 如果路径名太长。
  • 如果您的流程已经打开了太多文件。
  • 如果系统已经打开了太多文件。
  • 如果路径名是指设备文件,并且系统中没有此类设备。
  • 如果内核内存不足。
  • 如果文件系统已满。
  • 如果路径名的组件不是目录。
  • 如果文件位于只读文件系统上。
  • 如果文件是当前正在执行的可执行文件。

答案 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。