在 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;
}
}
该函数按预期工作:输入文件名,直到给出正确的文件名,在这种情况下,它将流与文件关联并返回文件名字符串。
然后我尝试注释掉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()
是相关的。如果您的程序仍然结束,则不必清除错误标志。
相关文章:
- 为什么stream::忽略未按预期工作
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- OpenCV RTP-Stream with FFMPEG
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 在 Stream C++ 文本之前有一个额外的换行符
- 在 STL 容器的 STL 容器上调用 clear
- 了解 cin.fail() 和 cin.clear语言 - Vector 追加程序
- 在 c++ 中,发生故障后是否需要 stream.clear()?
- 为什么不能通过在错误输入后设置 std::cin.clear() 来使用 std::cin?
- 测试"stream >> char"有什么作用?
- 为什么Boost Variant使用模板构造函数而不是Boost::beast::websocket::stream的移
- cin.clear()是否保留EOF
- cv::cuda::Stream选择线程默认流
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- C++向量:clear() 和 resize() 之间的区别
- 什么是"Reading unbounded stream from standard input (Memory Management)"的例子
- Boost::Beast Websocket Bidirection Stream (C++)
- std::vector::clear()ing 二维向量线程的内部向量安全吗?
- QPointer::clear() 是删除其引用的指针,还是"Clears this QPointer object."其他含义?
- 使用cin.clear的一般用途是什么?