Boost::iostreams::filtering_istream包裹std::cin时等待EOF问题咨询
为什么用Boost::iostreams::filtering_istream包装std::cin后程序一直等待EOF?
嘿,我来帮你拆解下这个问题——你的代码里有两个关键细节没处理好,才导致程序看起来一直卡在等待EOF的状态:
第一个问题:输入提示没显示出来,你误以为程序卡住了
你写的std::cout << "Write something:";这句话,默认情况下std::cout是行缓冲的——也就是说,只有当输出内容包含换行符\n,或者你手动刷新缓冲区时,内容才会显示到终端上。因为你这里没加换行也没刷新,所以这个提示其实一直存在缓冲区里没出来,你看不到提示,自然以为程序在“等待EOF”,但实际上它是在等你输入内容呢!
第二个问题:无限循环没有终止条件
你的while(true)是个死循环,而且每次调用cinn.get(c)后,根本没检查读取是否成功。哪怕已经读到了输入的末尾(EOF),循环还是会一直跑下去,不断尝试读取失败的字符,直到你手动发送EOF信号才能停下。
修正后的代码
我把这两个问题都修复了,同时用了Boost iostreams更标准的用法:
#include <iostream> #include <boost/iostreams/filtering_stream.hpp> // compile using g++ -std=c++11 -lboost_iostreams int main(){ boost::iostreams::filtering_istream cinn; cinn.push(std::cin); // 更推荐的方式:把std::cin加入过滤流链 std::cout << "Write something:" << std::flush; // 手动刷新缓冲区,确保提示立刻显示 char c; // 检查读取是否成功,到达EOF或出错时自动退出循环 while(cinn.get(c)){ std::cout << "Your character is : " << c << "\n"; // 补全换行,让输出更清晰 } return 0; }
关键改动说明
- 用
cinn.push(std::cin)替代直接构造:这是Boost iostreams官方更推荐的用法,虽然直接构造也能运行,但push方式更灵活——之后你要加压缩、加密这类过滤器时,直接继续push就行。 - 添加
std::flush:强制把输出缓冲区里的提示内容立刻显示到终端,你就能看到输入提示,不会再误以为程序卡住。 - 修改循环条件为
while(cinn.get(c)):get()方法在读取成功时返回流对象(会被隐式转为true),读取失败(比如到达EOF、流出错)时返回false,这样循环会自动终止,不用一直等手动发EOF。
最后补充下:在终端输入内容后,如果你想结束输入,Linux/macOS按Ctrl+D,Windows按Ctrl+Z就行啦。
内容的提问来源于stack exchange,提问作者srbcheema1
相关产品推荐
相关产品推荐

