我正在使用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)
它表示如果无法打开文件,它会设置failbit.所以你可以检查一下这个位:
fileStream.open("logs.txt");
if (fileStream.fail()) {
// file could not be opened
}
Run Code Online (Sandbox Code Playgroud)
其实,只是if (fileStream)
会在这里工作为好,因为ios
(基类的ifstream
,ofstream
和fstream
)具有转换运营商bool
.
不要担心失败异常.您可以通过调用请求在失败时抛出异常,ios::exceptions
但默认情况下不会抛出异常.
请注意,这并不能告诉您无法打开文件的原因.可能是文件不存在,路径中的目录不存在,您没有打开文件的权限,您的程序已达到可以打开的文件数量限制,等等上.没有可移植的方法来确定原因.
请注意,“文件存在”和“可以打开文件”之间是有区别的。
要检查文件是否存在(确实不需要打开/读取/写入文件),请使用fstat
或使用c ++副本-您不需要任何权限即可查询信息。
请注意,如果要在打开文件之前检查文件是否存在,则说明操作有误。在您检查和实际尝试打开文件之间,条件可能已更改。通常,您只需要使用打开/创建选项直接打开文件,而无需事先检查。
归档时间: |
|
查看次数: |
23545 次 |
最近记录: |