我正在读取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()
存储起始位置,然后读取多个字符,找到匹配的字符串并寻找起始位置+匹配字符串的长度。
答案 0 :(得分:1)
首先,您需要确保没有设置iostate
位(fail
,bad
或eof
。在C ++ 11中{{1}在调用eof
之前,会自动清除该位。
然后在手术后检查stram状态。如果设置了failbit,则在调用unget
之前忘记清除流状态。如果设置了unget
,则会出现内部错误。可能流不能再回来了。
除了badbit
之外,你不能保证你甚至不会忘记一个角色,库中应该支持至少放回一个角色。