触发EOF时调用unget

时间:2016-01-29 16:36:45

标签: c++ ifstream istream

我正在读取ifstream中的字符,如果这些字符与某个条件不匹配,那么我会unget()多次等于这些字符。这一切都很好,直到我到达文件的末尾。然后,如果我尝试unget(),则将该位设置为0.

这意味着没有任何字符会被取消,当我再次阅读时,我会得到空白字符。如果我达到EOF,怎么能在没有正确的情况下取消?

谢谢:)

修改

我试图用unget()替换我的putback(),但是我没有遇到错误,有些而不是放回字符似乎覆盖了ifstream中的字符。这是我正在使用的代码:

if (substr.length() > 0)
{
    for (int i = substr.length()-1; i >= 0; --i)
    {
        std::cout << "at " << i << ": " << substr.at(i) << " ";
        infile.putback(substr.at(i));
    }
}

其中substr是要回放到流的字符串。我把它以相反的顺序放回去,所以下次按正确的顺序读取它。

如果流接下来的字符串为“,r1”,我将“#1”放回流中。在回归之后,我希望它将接下来的5个字符读作“#1”,但是它将其读作“#r1”......某处“1”被覆盖。

修改/解决: 我改为使用unget()putback(),而不是使用seekg()tellg()。我用tellg()存储起始位置,然后读取多个字符,找到匹配的字符串并寻找起始位置+匹配字符串的长度。

1 个答案:

答案 0 :(得分:1)

首先,您需要确保没有设置iostate位(failbadeof。在C ++ 11中{{1}在调用eof之前,会自动清除该位。

然后在手术后检查stram状态。如果设置了failbit,则在调用unget之前忘记清除流状态。如果设置了unget,则会出现内部错误。可能流不能再回来了。

除了badbit之外,你不能保证你甚至不会忘记一个角色,库中应该支持至少放回一个角色。

相关问题