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

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

本文关键字:stream clear 是否 c++ 故障      更新时间:2023-10-16

我有以下代码:

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;
}
}

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

然后我尝试注释掉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。

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