putback()和unget()的区别
Difference between putback() and unget()
我使用标准iostream从文件中获取一些输入,我对unget()
与putback(character)
感到困惑。在我看来,从文档来看,这些功能实际上是相同的,而unget()
只是记住了输入的字符,所以我很紧张。我一直使用putback(character)
,但character
总是最后读字符,我一直在考虑改为unget()
。如果character
总是最后读字符,putback(character)
是否总是与unget()
相同?
你不能对unget()
撒谎。它"ungets"最后读的字符。你可以使用putback(c)
。您可以"放回"除最后读的字符以外的一些字符。有时候把最后读到的字符以外的字符放回去是有用的。
同样,如果底层读缓冲区确实具有缓冲能力,您可以"回放"多个字符。我认为ungetc()
限定为一个字符。
编辑
不。看起来unget()
可以追溯到putback()
这可能不是您期望的答案,但我想介绍一下我的推理。文档显示putback
和unget
方法分别调用streambuf::sputbackc
和streambuf::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
会把值正确吗?我对此表示怀疑,但在操作文件时不应该出现这种情况。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 返回递归调用和仅递归调用的区别
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- 修改和非修改 putback() 之间的区别
- putback()和unget()的区别