3 回答
TA贡献1886条经验 获得超2个赞
-1 get表示您已到达文件末尾。使用std::char_traits<char>::eof()(或std::istream::traits_type::eof())比较它-避免使用-1,这是一个神奇的数字。(尽管另一个有点冗长-您可以随时致电istream::eof)
只有在读取尝试读取文件末尾之后才设置EOF标志。如果我有一个3字节的文件,而我只读取3个字节,则EOF为false,因为我还没有尝试读取文件末尾的内容。虽然这对于通常知道文件大小的文件来说似乎令人困惑,但是直到尝试在某些设备(例如管道和网络套接字)上进行读取时,才能知道EOF。
第二个例子inf >> foo总是会返回inf,并带有尝试读取并将其存储在中的副作用foo。inf,在if或while将要评估true,如果该文件是“好”:没有错误,没有EOF。因此,当读取失败时,将其inf评估为false,并且循环将正确终止。但是,请考虑以下常见错误:
while(!inf.eof()) // EOF is false here
{
inf >> x; // read fails, EOF becomes true, x is not set
// use x // we use x, despite our read failing.
}
但是,这:
while(inf >> x) // Attempt read into x, return false if it fails
{
// will only be entered if read succeeded.
}
这就是我们想要的。
TA贡献1871条经验 获得超8个赞
仅在读取操作尝试读取文件末尾之后才设置EOF标志。get()正在返回符号常量traits::eof()(恰好等于-1),因为它到达了文件的末尾并且无法再读取任何数据,并且只有在那时eof()才是true。如果要检查这种情况,可以执行以下操作:
int ch;
while ((ch = inf.get()) != EOF) {
std::cout << static_cast<char>(ch) << "\n";
}
- 3 回答
- 0 关注
- 901 浏览
添加回答
举报