在 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。
我有以下代码:
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。