【问题标题】:Returning to beginning of file after getlinegetline 后返回文件开头
【发布时间】:2011-03-17 17:57:43
【问题描述】:

所以我已经从一个文件中读取了所有行

while (getline(ifile,line))
    {
        // logic
    }

其中 ifile 是一个 ifstream 而 line 是一个字符串

我的问题是我现在想再次使用getline,并且似乎无法返回到文件的开头,因为正在运行

cout << getline(ifile,line);

将返回 0

我尝试过使用:

ifile.seekg (0, ios::beg);

无济于事,似乎没有效果。如何回到文件的开头?

【问题讨论】:

    标签: c++


    【解决方案1】:

    由于您已到达(并试图读取过去)文件末尾,因此将设置 eoffail 标志。你需要使用ifile.clear 清除它们——然后尝试寻找:

    ifile.clear();
    ifile.seekg(0);
    

    【讨论】:

    • 就像旁注一样,在 C++11 中,如果在调用之前设置了 seekg,则 seekg 清除 eofbit 标志。
    • 我找不到任何对该标准的参考,但可以这么说,证据就在布丁中。使用 gcc9.2 并使用 c++17 标准编译实际上不会导致流从头开始,除非在 seekg() 之前调用 clear()。也许这是 gcc 中的一个实现错误?
    • 再读一个字符,然后fails。同样,我不确定这是否是实现的一些工件,但似乎如果您读取流中可用的内容(来自文件或字符串对象或任何其他流对象),则需要调用 clear在 seekg 将按描述工作之前。
    • @Onofog 对,我的代码完全不相关。事实上,C++11 并没有改变相关语义,我的回答错了。根据规范,该代码仍会清除eofbit。但这还不够,因为failbit在我们读取到文件末尾后被设置(这是 while(getline(…)) 循环的最后一次迭代所做的。
    【解决方案2】:

    这是因为已在流上设置了 eof 标志 - 因为您到达了文件的末尾。因此您必须将其作为附加步骤清除。

    例如

    ifile.clear();
    ifile.seekg (0, ios::beg);
    

    【讨论】:

      【解决方案3】:

      仅供参考:就我而言,订单确实很重要,因此

      1. 清除
      2. 寻找

      否则下一个 getline 操作失败 (MSVC v120)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 2016-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多