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

Posted

技术标签:

【中文标题】如何使用 fstream::open() 检查 C++ 中是不是存在文件【英文标题】:How to check if a file exists in C++ with fstream::open()如何使用 fstream::open() 检查 C++ 中是否存在文件 【发布时间】:2014-10-03 06:12:23 【问题描述】:

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

返回值

如果函数打开文件失败,则设置失败位状态标志 对于流(如果该状态标志可能会抛出 ios_base::failure 已使用成员异常注册)。

它说没有指定返回值。但是在失败的情况下,会设置一个标志。我的问题是,我应该然后访问该标志,或者更好地问,我应该如何查看open() 是否成功。

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

int Log::add()

    fstream fileStream;

    fileStream.open("logs.txt");

【问题讨论】:

fileStream.is_open()? en.cppreference.com/w/cpp/io/basic_ifstream/is_open 那么在失败的情况下标志和异常呢? is_open 经常在 open() 之后立即使用吗? C++ 在那个领域相当糟糕。有两个标志:failbad 可以测试,但它不会告诉您文件是否受到保护或不存在或路径错误... 【参考方案1】:

如果文件无法打开,它会设置故障位。所以你可以检查那个位:

fileStream.open("logs.txt");
if (fileStream.fail()) 
    // file could not be opened

实际上,if (fileStream) 也可以在这里工作,因为 iosifstreamofstreamfstream 的基类)有一个到 bool 的转换运算符。

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

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

【讨论】:

请注意,使用is_open() 更安全。至少在我的经验中,坏位和失败位并不总是在调用之间正确重置... 另请注意.good(),这表示eofbit failbitbadbit 中的所有三个都未设置,这也会捕获EOF 条件。【参考方案2】:

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

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

请注意,如果您想在打开文件之前检查文件是否存在,那么您做错了。在您的检查和实际打开文件的尝试之间,情况可能已经改变。通常,您只需使用打开/创建选项直接打开文件,无需事先检查。

【讨论】:

什么是“它的 c++ 对应物”?【参考方案3】:

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

#include <sys/stat.h>

inline bool exists (const std::string& filename) 
  struct stat buffer;   
  return (stat (filename.c_str(), &buffer) == 0); 

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

#include <experimental/filesystem>

bool exist = std::experimental::filesystem::exists(filename);

& 在 C++17 中:(reference)

#include <filesystem>

bool exist = std::filesystem::exists(filename);

【讨论】:

【参考方案4】:

is_openfail两种方法,例如:

string path = "not_exists.txt";
ifstream fin(path);

if(fin.is_open())
    cout<<"file is open"<<endl;
 else
    cout<<"file isn't open"<<endl;


if(fin.fail())
    cout<<"file open fail"<<endl;
 else
    cout<<"file open success"<<endl;

输出如下:

见: http://www.cplusplus.com/reference/fstream/ifstream/供参考。

【讨论】:

以上是关于如何使用 fstream::open() 检查 C++ 中是不是存在文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Paypal API / SDK,我将如何检查某个订阅 ID? C#

如何通过使用 C、C++ 在 Linux 上指定其名称以编程方式检查特定守护程序是不是正在运行?

如何在C中检查stdin是不是为空

如何使用bool函数检查C ++中密码的强度

如何使用 C API 检查 SQLite 列中的值是不是为 NULL?

如何在 eclipse c/c++ 版本中检查纯文本文件的拼写?