我想打开一个文件进行读取。然而,在这个程序的上下文中,如果文件不存在也没关系,我只是继续前进。我想能够识别什么时候错误是“找不到文件”,什么时候错误是其他的。否则意味着我需要退出并出错。我看不出用fstream做这件事有什么明显的方法。我可以用C的open()和perror()来做这件事,我假设也有一个fstream的方法来做这件事。
fstream
open()
perror()
mo49yndu1#
编辑:我已经被告知,这并不一定表明一个文件不存在,因为它可能是由于访问权限或其他问题标记以及。我知道我已经很晚才回答这个问题,但是我想我还是要给浏览的人留下一条评论。你可以使用ifstream的失败指示器来判断一个文件是否存在。
ifstream myFile("filename.txt"); if(myFile.fail()){ //File does not exist code here } //otherwise, file exists
of1yzvn42#
我不认为你可以知道“文件不存在”。你可以使用is_open()进行一般性检查:
ofstream file(....); if(!file.is_open()) { // error! maybe the file doesn't exist. }
如果使用boost,则可以使用boost::filesystem:
boost
boost::filesystem
#include <boost/filesystem.hpp> int main() { boost::filesystem::path myfile("test.dat"); if( !boost::filesystem::exists(myfile) ) { // what do you want to do if the file doesn't exist } }
v440hwme3#
由于打开文件的结果是特定于操作系统的,我不认为标准C++有任何方法来区分各种类型的错误。你可以试着打开文件进行读取,如果它没有打开(ifstream::is_open()返回false),你就知道它不存在或者发生了其他错误。
ifstream::is_open()
false
z5btuh9x4#
从http://www.cplusplus.com/forum/general/1796/开始的简单方法
ifstream ifile(filename); if (ifile) { // The file exists, and is open for input }
kxe2p93d5#
您可以使用stat,它应该可以跨平台移植,并且位于标准C库中:
#include <sys/stat.h> bool FileExists(string filename) { struct stat fileInfo; return stat(filename.c_str(), &fileInfo) == 0; }
如果stat返回0,则文件(或目录)存在,否则不存在。我假设您必须对文件路径中的所有目录都具有访问权限。我还没有测试可移植性,但this page建议这应该不是问题。
uoifb46i6#
更妙的道:
std::ifstream stream; stream.exceptions(std::ifstream::failbit | std::ifstream::badbit); stream.open(fileName, std::ios::binary);
67up9zun7#
在C++17中,您可以使用std::filesystem::exists。
std::filesystem::exists
ukdjmx9f8#
让我举一个真实跑步的例子:1.文件不存在:
1.文件已存在:
有关其公共函数更多信息,请参见http://www.cplusplus.com/reference/fstream/ifstream/。
daupos2t9#
直接方式而不创建ifstream对象。
if (!std::ifstream(filename)) { // error! file doesn't exist. }
9条答案
按热度按时间mo49yndu1#
编辑:我已经被告知,这并不一定表明一个文件不存在,因为它可能是由于访问权限或其他问题标记以及。
我知道我已经很晚才回答这个问题,但是我想我还是要给浏览的人留下一条评论。你可以使用ifstream的失败指示器来判断一个文件是否存在。
of1yzvn42#
我不认为你可以知道“文件不存在”。你可以使用is_open()进行一般性检查:
如果使用
boost
,则可以使用boost::filesystem
:v440hwme3#
由于打开文件的结果是特定于操作系统的,我不认为标准C++有任何方法来区分各种类型的错误。
你可以试着打开文件进行读取,如果它没有打开(
ifstream::is_open()
返回false
),你就知道它不存在或者发生了其他错误。z5btuh9x4#
从http://www.cplusplus.com/forum/general/1796/开始的简单方法
kxe2p93d5#
您可以使用stat,它应该可以跨平台移植,并且位于标准C库中:
如果stat返回0,则文件(或目录)存在,否则不存在。我假设您必须对文件路径中的所有目录都具有访问权限。我还没有测试可移植性,但this page建议这应该不是问题。
uoifb46i6#
更妙的道:
67up9zun7#
在C++17中,您可以使用
std::filesystem::exists
。ukdjmx9f8#
让我举一个真实跑步的例子:
1.文件不存在:
1.文件已存在:
有关其公共函数更多信息,请参见http://www.cplusplus.com/reference/fstream/ifstream/。
daupos2t9#
直接方式而不创建ifstream对象。