【问题标题】:Rewind an ifstream object after hitting the end of file到达文件末尾后倒回 ifstream 对象
【发布时间】:2015-04-04 13:03:15
【问题描述】:

有一个包含几个字符(比如说 10 个)的文本文件,您可以尝试从中读取 1000 个字符。

char *buf = new char[1000];
ifstream in("in.txt");
in.read(buf, 1000);

这当然会设置eofbit 标志(以及failbit),但是,您将能够获得所需的字符。

现在,假设您想再次读取文件(从头开始):

in.seekg(0);        // Sets input position indicator. 
in.read(buf, 100);  // Try to read again.

这不起作用:因为如果你打电话:

int count = in.gcount()  // Charecters readed from input.

您会注意到count == 0。这意味着它根本没有读取任何内容。

因此问题是:到达文件末尾后如何回退文件?

【问题讨论】:

    标签: c++ io ifstream


    【解决方案1】:

    解决方案

    使用clear 在调用seekg 之前清理ifstream 的状态。 如果以后不需要知道状态,请务必先检查。

    in.clear();
    in.seekg(0);
    

    说明

    seekg 设置光标位置,但不清除 状态位 failbit 因此,ifstream 实例“认为”还有一些问题。

    来自标准规范:

    std::basic_istream::seekg 的行为与 UnformattedInputFunction 相同,但 gcount() 不受影响。

    我们可以阅读UnformattedInputFunction:

    以下标准库函数是UnformattedInputFunctions

    basic_istream::seekg,除了它首先清除eofbit并且不修改gcount

    在问题示例中,如果您打印得到 seekg 之前和之后的状态:

    cout << "State before seekg: " << in.rdstate() << endl;   // Prints 3 (11 in binary) failbit and eofbit activated.
    in.seekg(0);
    cout << "State after seekg: " << in.rdstate() << endl;    // Prints 2 (10 in binary) just failbit activated.
    

    这就是为什么!

    seekg 不清除 failbit 并且由于某些实施原因,它不适用于激活此类位。

    我的猜测

    为什么failbit激活后seekg不起作用?

    这与这个位不仅在流到达文件末尾时被激活的事实有关。并且可能在激活失败位后使用seekg 容易出错或可能显示未定义行为的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2022-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      相关资源
      最近更新 更多