ifstream:如何判断指定的文件是否不存在

Pau*_*han 41 c++ file

我想打开一个文件进行阅读.但是,在这个程序的上下文中,如果文件不存在就可以了,我继续.我希望能够识别错误何时"未找到文件"以及何时出现错误.否则意味着我需要退出并出错.

我没有看到一个明显的方法来做到这一点fstream.


我可以用C open()perror().我推测有一种fstream方法可以做到这一点.

Swa*_*oth 60

编辑:我已收到通知,这并不一定表明文件不存在,因为它可能会因访问权限或其他问题而被标记.

我知道我回答这个问题的时间已经很晚了,但我认为无论如何我都会留下评论给任何人浏览.您可以使用ifstream的失败指示器来判断文件是否存在.

ifstream myFile("filename.txt");
    if(myFile.fail()){
        //File does not exist code here
    }
//otherwise, file exists
Run Code Online (Sandbox Code Playgroud)

  • 你建议的不是检查"找不到文件"的方法.`fail()`不表示"文件不存在",它只表示"出错了".在您的特定示例中,它可以是"拒绝访问"或"共享违规"等. (4认同)

Ara*_*raK 38

我认为你不知道"文件不存在".您可以使用is_open()进行泛型检查:

ofstream file(....);
if(!file.is_open())
{
  // error! maybe the file doesn't exist.
}
Run Code Online (Sandbox Code Playgroud)

如果您正在使用,boost您可以使用boost::filesystem:

#include <boost/filesystem.hpp>
int main()
{
    boost::filesystem::path myfile("test.dat");

    if( !boost::filesystem::exists(myfile) )
    {
        // what do you want to do if the file doesn't exist 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它不是游戏而是ifstream! (7认同)
  • 这不是一个固有的独特解决方案吗? (6认同)

Cog*_*eel 9

由于打开文件的结果是特定于操作系统的,我认为标准C++没有任何方法可以区分各种类型的错误.该文件打开或不打开.

您可以尝试打开文件进行读取,如果没有打开,您知道它不存在或发生其他错误.然后,再次,如果你试图打开它后写,它失败,那可能属于"别的"类别.


LI *_*ong 7

一个简单的方法来自http://www.cplusplus.com/forum/general/1796/

ifstream ifile(filename);
if (ifile) {
  // The file exists, and is open for input
}
Run Code Online (Sandbox Code Playgroud)

  • 如果其他人想知道:[根据文档](https://en.cppreference.com/w/cpp/io/basic_ifstream),这与 `!ifile.fail()` 相同。`if(!ifile)` 等同于 `ifile.fail()`。 (2认同)

Eri*_*son 5

您可以使用stat,它应该可以跨平台移植,并且位于标准C库中:

#include <sys/stat.h>

bool FileExists(string filename) {
    struct stat fileInfo;
    return stat(filename.c_str(), &fileInfo) == 0;
}
Run Code Online (Sandbox Code Playgroud)

如果stat返回0,则文件(或目录)存在,否则不存在.我假设你必须拥有文件路径中所有目录的访问权限.我没有测试过可移植性,但是这个页面表明它应该不是问题.

  • 这是一个错误的事情,因为在AFTER stat()返回和BEFORE`fstream`的open()实际打开文件之前,文件可能已经消失(由系统中的另一个进程删除). (4认同)