提问人:Kumar 提问时间:3/29/2016 最后编辑:BiffenKumar 更新时间:12/29/2022 访问量:1804
文件读取失败,并显示 ios_base::failbit
File read fails with ios_base::failbit
问:
我有一个简单的C++文件读取程序:
int main() {
std::string buf;
std::ifstream file;
file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
try {
file.open("C:\\Test11.txt");
char c;
while (!(file.eof())) {
file.get(c);
std::cout << c;
}
}
catch (std::ifstream::failure e) {
std::cout << e.what() << std::endl;
std::cout << e.code() << std::endl;
std::cout << "Exception opening/reading file";
}
file.close();
return 0;
}
文件的内容是 。C:\Test11.txt
Hello
程序能够读取内容,但因异常而失败。评估时似乎有问题。ios_base::failbit
while (!(file.eof()))
出了什么问题?
答:
2赞
Martin York
12/29/2022
#1
问题是,在您尝试读取文件末尾之前,这是不正确的。eof()
因此,一旦您正确读取了整个文件并且文件中没有剩余数据。的结果仍然是假的(因为你还没有读到最后)。下一次读取将设置,但下一次读取也将失败(从而引发异常)。eof()
eof()
这就是为什么检查是一种反模式的原因。eof()
while (!(file.eof()))
{
file.get(c);
std::cout << c;
}
更好(正确)的模式是:
while (file.get(c)) // reads next character into c returns a ref to file.
// Note: when a stream is used in a boolean context
// such as an while () it is converted to bool
// using !good(). Thus if the read fails
// and the bad bit is set and the loop will exit.
{
std::cout << c;
}
评论