istringstream与ostringstream绑定(tie)后无法正确读取内容的问题咨询
istringstream与ostringstream绑定(tie)后无法正确读取内容的问题咨询
大家好,我遇到了一个关于C++中istringstream和ostringstream绑定的问题,想请教一下各位:
我写了这段代码:
auto main() -> int { istringstream is; ostringstream os; is.tie(&os); string name = "hello"; os << name; string newName; is >> newName; cout << newName << endl; }
我原本以为控制台会输出hello,但实际运行后结果是空的,这让我很困惑,想知道问题出在哪里?
问题原因与解决办法
其实核心问题是对tie()函数的理解偏差哦!很多人会误以为把输入流和输出流绑定后,写入输出流的内容会自动同步到输入流的缓冲区,但实际上tie()的功能根本不是做这个的~
tie()的作用是:当你对输入流执行读取操作时,会先触发绑定的输出流的刷新(flush)动作,确保输出流里的内容都被写到目标位置,但它完全不会把输出流的内容复制到输入流的缓冲区中。
回到你的代码:is是一个初始为空的istringstream,os是独立的ostringstream,你把它们绑定后,往os里写入了"hello",但is的缓冲区依然是空的,所以从is读取内容时自然拿不到任何数据,输出就是空的。
如果想要实现把写入os的内容读到is里,你需要手动将os的内容同步到is的缓冲区,修改后的代码如下:
auto main() -> int { istringstream is; ostringstream os; string name = "hello"; os << name; is.str(os.str()); // 将os的字符串内容设置为is的输入缓冲区 string newName; is >> newName; cout << newName << endl; // 此时会正常输出hello }
这样修改后,is的缓冲区就有了"hello",读取操作就能正常拿到内容啦。
备注:内容来源于stack exchange,提问作者xunhaohw
相关产品推荐
相关产品推荐

