ofstream :: open何时会失败?

问题描述

| 我正在尝试在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。