首页 > 后端开发 > C++ > 为什么 `ifstream::eof()` 与 `get()` 和提取运算符 (`>>`) 的行为不同?

为什么 `ifstream::eof()` 与 `get()` 和提取运算符 (`>>`) 的行为不同?

DDD
发布: 2024-12-02 06:36:11
原创
930 人浏览过

Why Does `ifstream::eof()` Behave Differently with `get()` and the Extraction Operator (`>>`)?
“/>>`)?

深入了解 ifstream 的 eof() 函数

理解 ifstream 的 eof() 函数的行为可能会令人费解,如提供的代码片段所示:

<前>

包括

include

int main() {

std::fstream inf( "ex.txt", std::ios::in );
while( !inf.eof() ) {
    std::cout << inf.get() << "\n";
}
inf.close();
inf.clear();
inf.open( "ex.txt", std::ios::in );
char c;
while( inf >> c ) {
    std::cout << c << "\n";
}
return 0;
登录后复制

}

让我们深入研究一下解释提供:

何时真正设置 EOF

eof() 函数会检测读取操作何时尝试访问文件末尾之外的数据,这意味着:

  • 如果您有一个内容为“abc”的文件并读取了 3 个字符,eof() 将是false。
  • 但是如果你尝试读取第 4 个字符,eof() 将变为 true,表明已到达文件末尾。

此行为的原因是为了确保与不同设备(例如管道和套接字)的兼容性,其中文件大小的概念可能不像文本那么简单file.

揭开 get() 和 >>

代码片段中的两个循环使用不同的方法来读取文件内容的魔力:

  • 第一个循环使用 inf.get() 一次检索一个字符。当到达文件末尾时,get() 返回 -1。
  • 第二个循环使用 inf >>> c,它将读取尝试和分配结合在一个操作中。这种方法将 c 设置为从文件中读取的值,但如果读取失败(由于到达文件末尾),则其计算结果为 false,从而终止循环。

这解释了为什么第一个循环读取一个额外的字符并显示 -1,而第二个循环给出正确的输出 - 它在尝试读取超出末尾的内容之前终止循环

避免 -1 的危险

为了避免依赖幻数 -1 来识别文件结尾,建议使用 std: :char_traits::eof() 或 std::istream::traits_type::eof() 代替。

以上是为什么 `ifstream::eof()` 与 `get()` 和提取运算符 (`>>`) 的行为不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板