如何使用fstream :: open()检查C++中是否存在文件

Mos*_*ebi 3 c++

我正在使用fstream库来处理文件.基本上,我需要知道某个文件是否存在.在线c ++文档中,关于open(),它的内容如下:

回报价值

没有

如果函数无法打开文件,则为流设置failbit状态标志(如果使用成员例外注册了该状态标志,则可能会抛出ios_base :: failure).

它表示没有指定返回值.但是如果失败,则设置标志.我的问题是,我应该然后访问那个标志,或者更好地问一下,我该怎么看才能open()成功.

到目前为止我有这个代码:

int Log::add()
{
    fstream fileStream;

    fileStream.open("logs.txt");
}
Run Code Online (Sandbox Code Playgroud)

Ami*_* G. 11

您的方法不检查是否存在,而是检查可访问性。可以这样检查是否存在:

#include <sys/stat.h>

inline bool exists (const std::string& filename) {
  struct stat buffer;   
  return (stat (filename.c_str(), &buffer) == 0); 
}
Run Code Online (Sandbox Code Playgroud)

在 C++14 中可以使用这个:

#include <experimental/filesystem>

bool exist = std::experimental::filesystem::exists(filename);
Run Code Online (Sandbox Code Playgroud)

& 在 C++17 中:(参考

#include <filesystem>

bool exist = std::filesystem::exists(filename);
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 9

它表示如果无法打开文件,它会设置failbit.所以你可以检查一下这个位:

fileStream.open("logs.txt");
if (fileStream.fail()) {
    // file could not be opened
}
Run Code Online (Sandbox Code Playgroud)

其实,只是if (fileStream)会在这里工作为好,因为ios(基类的ifstream,ofstreamfstream)具有转换运营商bool.

不要担心失败异常.您可以通过调用请求在失败时抛出异常,ios::exceptions但默认情况下不会抛出异常.

请注意,这并不能告诉您无法打开文件的原因.可能是文件不存在,路径中的目录不存在,您没有打开文件的权限,您的程序已达到可以打开的文件数量限制,等等上.没有可移植的方法来确定原因.


Non*_*upt 6

请注意,“文件存在”和“可以打开文件”之间是有区别的。

要检查文件是否存在(确实不需要打开/读取/写入文件),请使用fstat或使用c ++副本-您不需要任何权限即可查询信息。

请注意,如果要在打开文件之前检查文件是否存在,则说明操作有误。在您检查和实际尝试打开文件之间,条件可能已更改。通常,您只需要使用打开/创建选项直接打开文件,而无需事先检查。

  • 什么是“其c ++对应物”? (2认同)