putback()和unget()的区别

Difference between putback() and unget()

本文关键字:区别 putback unget      更新时间:2023-10-16

我使用标准iostream从文件中获取一些输入,我对unget()putback(character)感到困惑。在我看来,从文档来看,这些功能实际上是相同的,而unget()只是记住了输入的字符,所以我很紧张。我一直使用putback(character),但character总是最后读字符,我一直在考虑改为unget()。如果character总是最后读字符,putback(character)是否总是与unget()相同?

你不能对unget()撒谎。它"ungets"最后读的字符。你可以使用putback(c)。您可以"放回"除最后读的字符以外的一些字符。有时候把最后读到的字符以外的字符放回去是有用的。

同样,如果底层读缓冲区确实具有缓冲能力,您可以"回放"多个字符。我认为ungetc()限定为一个字符。

编辑
不。看起来unget()可以追溯到putback()

这可能不是您期望的答案,但我想介绍一下我的推理。文档显示putbackunget方法分别调用streambuf::sputbackcstreambuf::sungetc。定义如下:

streambuf: sungetc

将get指针向后移动一个字符,使上一次输入操作获得的最后一个字符再次可供下一次输入操作使用。

在操作过程中,如果get指针gptr指向与起始指针eback相同的位置,则函数将调用受保护的虚成员函数pbackfail。

另一个:

streambuf: sputbackc

get指针被移回指向当前位置前的字符,这样最后得到的字符c再次成为下一个输入操作在该位置读取的字符。

在操作过程中,如果字符c与gptr()[-1]不匹配,或者get指针gptr指向与起始指针eback相同的位置,则函数调用受保护的虚成员函数pbackfail。

当c与该位置的字符不匹配时,streambuf中pbackfail的默认定义将在可能的情况下将c作为该位置提取的字符,但派生类可能会覆盖此行为。

成员函数sungetc的行为与此类似,但不带任何参数

如果字符不匹配,sputbackc调用pbackfail,这意味着该方法必须检查值是否相等。看起来额外的检查是唯一的开销,但我不知道在实践中是如何解决的。我可以想象,如果最后一个字符没有存储在对象中,那么必须重新读取它,所以即使字符保证相同,您也可能期望它。

当我们调用unget时,我有点担心情况,但是最后一个字符不可用。putback会把值正确吗?我对此表示怀疑,但在操作文件时不应该出现这种情况。