触发 EOF 时调用 unget

Calling unget when EOF is triggered

我正在从 ifstream 中读取字符,如果这些字符不符合特定条件,那么我 unget() 的次数等于这些字符。在我到达文件末尾之前,这一切都很好。然后如果我尝试 unget(),好的位设置为 0。

这意味着没有字符是未读出的,当我再次阅读时,我得到的是空白字符。如果我到达EOF,我怎么能没有正确地取消?

谢谢:)

编辑:

我试图用 putback() 替换我的 unget(),但是没有,我遇到了一些错误,而不是放回字符,它似乎覆盖了 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,”被覆盖了。

EDIT/SOLVED: 我没有使用 unget()putback(),而是使用 seekg()tellg()。我用tellg()存储起始位置,然后读取任意多个字符,找到匹配的字符串并返回到起始位置+匹配字符串的长度。

首先,您需要确保未设置 iostate 位(failbadeof。在 C++11 中 eof 位将在调用 unget.

之前自动清除)

然后查看运行后的stram状态。如果设置了 failbit,那么你忘记在调用 unget 之前清除流状态。如果设置了 badbit,则存在内部错误。可能流不能再支持了。

你不能保证你甚至可以取消一个字符,不像 putback,库应该支持放回至少一个字符。