在 C++ 中,发生故障后是否需要 stream.clear()?

In c++, is stream.clear() necessary after a failure has occurred?

我有以下代码:

string promptPlayerForFile(ifstream &infile, string prompt) {
    while (true) {
        string filename;
        cout << prompt;
        getline(cin, filename);
        infile.open(filename.c_str());
        if (!infile.fail()) return filename;
        infile.clear();
        cout << "Unable to open that file. Try again." << endl;
    }
}

该函数按预期工作:您输入文件名,直到给出正确的文件名,在这种情况下,它将流与文件和 returns 文件名字符串相关联。

然后我尝试注释掉 infile.clear() 行,看看会发生什么。 (我读到它需要在发生故障后包含在内,以便重置流的相关位。)

但是,将其注释掉后,该函数的行为与以前一样。如果我先给出一个错误的文件名,然后给出一个正确的文件名,它就会工作,所以即使没有那一行,失败位也会以某种方式被重置。那么 infile.clear() 是必要的吗?它的适当用途是什么?

当且仅当您想要继续与流交互(例如从流中读取)时,infile.clear() 才是相关的。如果您的程序无论如何都结束了,您不必清除错误标志。

如果您使用的是 C++11 或更高版本,则无需调用 infile.clear();。如果 open() 成功,则调用 clear()

如果您使用的是C++11之前的编译器,则需要调用infile.clear()。该语言不保证在 open() 成功时清除故障位。

有关调用 clear() 的详细信息,请参阅 https://en.cppreference.com/w/cpp/io/basic_ifstream/open