【问题标题】:Calling unget when EOF is triggered触发 EOF 时调用 unget
【发布时间】:2016-05-07 11:36:15
【问题描述】:

我正在从 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”被覆盖了。

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

【问题讨论】:

    标签: c++ ifstream istream


    【解决方案1】:

    首先,您需要确保在调用 @ 之前没有设置 iostate 位(failbadeof。在 C++11 中,eof 位将被自动清除) 987654326@.

    然后在运行后检查 stram 状态。如果设置了失败位,那么您在调用unget 之前忘记清除流状态。如果设置了badbit,则存在内部错误。可能流无法再返回。

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

    【讨论】:

    • 即使我在 unget 操作之前调用 infile.clear() 清除标志,它仍然无法正常工作。每个步骤的标志如下所示: 清除之前... eof:1 好:0 失败:1 坏:0 清除后... eof:0 好:1 失败:0 坏:0 取消之后... eof: 0 好:0 失败:1 坏:1
    • @Pottsiex5 ,好吧,badbit 告诉我们在那个时候获取角色是不可能的。请记住:unget 不能保证即使对一个字符也有效。它真的取决于内部流状态,你不能用它做任何事情。尝试使用putback
    • 我不确定我现在做错了什么,但回退似乎覆盖了一些尚未读取的字符。这是可能发生的事情,还是我可能做错了什么?
    猜你喜欢
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    相关资源
    最近更新 更多