首页 >后端开发 >C++ >C 的 `ifstream::eof()` 函数如何真正与 `get()` 和提取运算符一起工作?

C 的 `ifstream::eof()` 函数如何真正与 `get()` 和提取运算符一起工作?

Susan Sarandon
Susan Sarandon原创
2024-11-29 18:48:11510浏览

How Does C  's `ifstream::eof()` Function Really Work with `get()` and the Extraction Operator?

理解 ifstream 的 eof() 函数

ifstream 类的 eof() 函数在 C 中的文件输入操作中起着至关重要的作用。然而,它的行为有时可能令人费解,特别是与 get() 函数相关。

考虑提供的示例:

#include <iostream>
#include <fstream>

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;
}

当输入文件“ex.txt”包含“abc”,第一个 while 循环在终止前读取四个字符。这是因为 eof() 仅在尝试读取文件末尾之后才设置 EOF 标志。第一个循环逐字符读取,直到读取失败,设置 EOF 标志。然而,get() 返回 -1 表示文件结束,不考虑 EOF 标志。

第二个循环,使用 >>>操作员表现出正确的行为。 >>操作符尝试读取一个字符(在本例中为字符串),并在读取失败时设置 EOF 标志。因此,循环在读取“abc”后结束。

解决混乱

为了避免混乱,请务必注意:

  • -1 是 get() 指示文件结束的方式。
  • eof() 设置超出文件末尾的读取尝试失败后的 EOF 标志。
  • 执行读取和 EOF 标志更新。

因此,使用>>建议使用 get() 代替 eof() 来准确检测文件结尾。

以上是C 的 `ifstream::eof()` 函数如何真正与 `get()` 和提取运算符一起工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn