为何循环中cin.rdbuf()->sbumpc()仅请求一次输入?
关于
std::basic_streambuf::sbumpc仅首次请求输入的原因 嘿,这个问题抓得很准——这背后是C++标准库流的缓冲机制在搞事情!
核心原因:流缓冲的预读取行为
默认情况下,std::cin使用的是行缓冲模式。当你第一次调用sbumpc()时:
- 它会触发一次系统调用,从标准输入读取一整行数据(直到你按下回车键),把这些数据全部存入
std::streambuf的内部缓冲区里。 - 后续每次调用
sbumpc(),其实只是从已经在内存里的缓冲区中取出下一个字符,完全不需要再向用户请求输入——直到缓冲区里的字符被全部读完,才会再次触发下一轮的读取请求。
结合你的示例代码来看
假设你运行程序后输入了abc123然后回车,第一次sbumpc()会把abc123\n全部读到缓冲区里:
#include <iostream> // std::cin, std::cout, std::streambuf, std::streamsize int main () { char ch; std::streambuf * pbuf = std::cin.rdbuf(); std::cout << "Please, enter some letters and then a number: "; do { ch = pbuf->sbumpc(); // 第一次调用:读取整行到缓冲区,之后每次只从缓冲取字符 } while (!isdigit(ch)); // 假设循环条件是直到读到数字 }
之后的循环里,sbumpc()会依次取出a、b、c、1,整个过程不会再让你输入,因为数据已经在缓冲里了。
额外补充:如何禁用缓冲(如果需要)
要是你想让每次sbumpc()都直接请求输入(无缓冲),可以修改流的缓冲设置:
std::cin.sync_with_stdio(false); std::cin.tie(nullptr); std::cin.rdbuf()->pubsetbuf(nullptr, 0); // 设置无缓冲
不过一般不推荐这么做,因为缓冲是为了减少系统调用次数,提升程序效率。
内容的提问来源于stack exchange,提问作者Armando
相关产品推荐
相关产品推荐

