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