如何在C++中检查文件是否存在?

10
我希望确定C++11中是否存在一个文件。
我有以下代码:
ifstream inputFile(c);

if (!inputFile.good()) {
        std::cout << "No file found" << '\n';           
}

并且

if (inputFile.peek() == std::ifstream::traits_type::eof()){
           ....
}


哪一个是正确的和惯用的?

1
你使用的是哪个版本的C++(c++11c++14,...)?建议/“最惯用”的解决方案可能会因此而异。 - druckermanly
@druckernamly 编辑,C++11 - nz_21
只是提一下:如果您可以访问C++17,那么std::filesystem::exists就在那里。 - DeiDei
我猜你的意图是检查文件是否可被进程读取。这与仅测试文件是否存在有些不同;它可能存在,但你的进程可能无法读取其内容(权限等问题)。 - prog-fh
我认为第一个看起来更好。如果您可以直接检查文件是否正确打开,为什么要检查任意与文件相关的函数是否返回错误呢? - HolyBlackCat
你几乎不需要检查文件是否存在。如果你需要打开一个文件,就去尝试打开它,并处理可能出现的错误。无论如何,你都需要处理错误。 - n. m. could be an AI
2个回答

11
在C++17中,你可以使用<filesystem>来进行以下操作:
namespace fs = std::filesystem;
fs::path f{ "file.txt" };
if (fs::exists(f)) std::cout << "yes";
else               std::cout << "nope";

值得注意的是,即使文件存在,也可能无法打开、读取或写入。在检查返回“true”之后的瞬间,它也可能被其他进程删除。 - Jesper Juhl

3
如果您正在使用C++11来确定文件是否存在,可以尝试以下方法。
#include <iostream>
#include <fstream>

int main(int argc, char *argv[]){
    std::ifstream file("myfile.txt");
    if(!file.is_open()){
        std::cout << "File not found" << std::endl;
        return -1;
    }

    return 0;
}

2
尝试使用"/etc/shadow""/etc/sudoers"进行测试吧;^) - prog-fh
虽然这只是一个常见的解决方案,但如果您的解决方案不够具体 - Peter
好的,我会尝试。 - Peter
std::basic_ios<CharT, Traits>::good函数返回true,当IO操作最近完成时,并不一定是正确或适当的解决方案。除非你有想要实现的目标,也许问题没有被正确地提出。 - Peter
2
这并不是很重要,只是词汇问题。我认为一个文件是否存在以及它是否可读是不同的事情。你的例子测试的是文件是否可读,如果失败了,就得出结论说没有找到这个文件。实际上它可能被找到了,但是由于权限问题不能读取(由你的进程),所以我会说这个文件是"不可读"的。(没什么大不了的...) - prog-fh
我想是这样,我改正我的说法。 - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接