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

C++ 如何检查C+中是否存在文件+;使用fstream::open(),c++,C++,我正在使用fstream库处理文件。基本上,我需要知道某个文件是否存在。在C++文档在线,关于Open*(),它读: 返回值 没有 如果函数无法打开文件,则设置failbit状态标志 对于流(如果该状态标志 已使用成员异常进行注册) 它表示未指定返回值。但如果失败,将设置一个标志。我的问题是,我应该访问该标志,或者更好地问,我应该如何查看open()是否成功 到目前为止,我有以下代码: int Log::add() { fstream fileStream; fileStrea

我正在使用fstream库处理文件。基本上,我需要知道某个文件是否存在。在C++文档在线,关于Open*(),它读:

返回值

没有

如果函数无法打开文件,则设置failbit状态标志 对于流(如果该状态标志 已使用成员异常进行注册)

它表示未指定返回值。但如果失败,将设置一个标志。我的问题是,我应该访问该标志,或者更好地问,我应该如何查看
open()
是否成功

到目前为止,我有以下代码:

int Log::add()
{
    fstream fileStream;

    fileStream.open("logs.txt");
}

它说,如果文件无法打开,它会设置故障位。因此,您可以检查该位:

fileStream.open("logs.txt");
if (fileStream.fail()) {
    // file could not be opened
}
实际上,只要
if(fileStream)
也可以在这里工作,因为
ios
(ifstream、
流的
fstream
的基类)有一个到
bool
的转换运算符

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


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

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

检查文件是否存在(并且您确实不需要打开/读/写文件),使用<代码> fSTAT < /C>或其C++对应物-您不需要任何权限来查询信息。


请注意,若要在打开文件之前检查文件是否存在,那个么这是错误的。在检查和实际尝试打开文件之间,条件可能已发生变化。通常,您只需使用“打开/创建”选项直接打开文件,而无需事先检查。

有两种方法
打开时
失败时
,例如:

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;
}
string path=“not_exists.txt”;
ifstream-fin(路径);
如果(fin.is_open()){

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

#include <sys/stat.h>

inline bool exists (const std::string& filename) {
  struct stat buffer;   
  return (stat (filename.c_str(), &buffer) == 0); 
}
#包括
内联布尔存在(常量std::字符串和文件名){
结构统计缓冲区;
返回(stat(filename.c_str(),&buffer)==0);
}
在C++14中,可以使用以下命令:

#include <experimental/filesystem>

bool exist = std::experimental::filesystem::exists(filename);
#包括
boolexist=std::experimental::filesystem::exists(文件名);
&在C++17中:()

#包括
bool exist=std::filesystem::exists(文件名);

fileStream.is_open()
?那么在出现故障的情况下,标志和异常如何?is_open在open()之后立即使用在这个字段中,C++是很不好的。有两个标志:<代码>失败>代码>和<代码>坏>代码>,可以测试,但是它不能告诉你文件是否被保护或不存在或者路径是错误的…注意使用<代码> iSyOn()更安全。“坏代码”和“失败代码”在调用之间不总是正确地重置,至少在我的经验中…也注意到“代码> >好()),这将表明所有三个代码< EFBIT < /C> >代码>故障位< /COD>和<代码> BADBIT < /C> >,这也会捕获EOF条件。“C++对应”是什么?
#include <filesystem>

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