我正在使用标准iostream从文件中获取一些输入,我对unget()
与putback(character)
感到困惑。从文档中可以看出,这些函数实际上是相同的,unget()
只记得放入的字符,所以我很紧张。我一直使用putback(character)
,但character
始终是最后读取的字符,我一直在考虑更改为unget()
。 putback(character)
始终与unget()
完全相同,如果character
始终是最后读取的字符吗?
答案 0 :(得分:16)
你不能与unget()
撒谎。它“取消”最后读取的字符。你可以骗putback(c)
。您可以“回放”除最后读取的字符之外的某些字符。有时候放回一个字符而不是最后读取的字符可能很有用。
此外,如果底层读缓冲区确实具有缓冲功能,则可以“回放”多个字符。我认为ungetc()
仅限于一个角色。
修改强>
不。看起来unget()
可以追溯到putback()
。
答案 1 :(得分:3)
这不是你可能期望的答案,但想要介绍我的推理。文档保留方法putback
和unget
分别调用streambuf::sputbackc
和streambuf::sungetc
。定义如下:
<强>流缓冲:: sungetc 强>
将get指针向后移动一个字符,使得输入操作获得的最后一个字符再次可用于下一个输入操作。
在操作期间,如果get指针gptr指向与开始指针eback相同的位置,该函数将调用受保护的虚拟成员函数pbackfail。
另一个:
<强>流缓冲:: sputbackc 强>
将get指针移回指向其当前位置之前的字符,以便最后获得的字符c再次可用作下一个输入操作在该位置读取的字符。
在操作期间,如果字符c与gptr()[ - 1]不匹配,或者get指针gptr指向与开始指针eback相同的位置,则该函数调用受保护的虚拟成员函数pbackfail。 / p>
当c与该位置的字符不匹配时,streambuf中pbackfail的默认定义会将c前置为在该位置提取的字符(如果可能),但派生类可能会覆盖此行为。
成员函数sungetc的行为方式与此类似,但不带任何参数
如果sputbackc
调用pbackfail
,如果字符不匹配,则表示该方法必须检查值是否相等。看起来额外的检查是唯一的开销,但不知道它是如何在实践中解决的。我可以想象,如果最后一个字符没有存储在对象中,那么它必须被重新读取,所以即使字符保证相同,你也可以期待它。
当我们打电话给unget
时,我有点担心情况,但最后一个角色不可用。 putback
会正确地赋值吗?我怀疑,但在操作文件时不应该这样。