我有以下代码:
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()
成功时,该语言不保证故障位被清除。
有关调用https://en.cppreference.com/w/cpp/io/basic_ifstream/open的详细信息,请参阅clear()
。
当且仅当您想要继续与流进行交互时(例如,从中读取),infile.clear()
才是相关的。如果您的程序仍然结束,则不必清除错误标志。