当我在某个时刻添加一个cout时,我很惊讶地看到我的程序突然变得安静了,所以我分离了负责的代码:
std::stringstream data;
data<<"Hello World\n";
std:std::fstream file{"hello.txt", std::fstream::out};
file<<data.rdbuf();
std::cout<<"now rdbuf..."<<std::endl;
std::cout<<data.rdbuf()<<std::endl;
std::cout<<"rdbuf done."<< std::endl;
该程序在没有最后的cout的情况下悄然退出。到底是怎么回事?如果我将最后一个.rdbuf()
更改为.str()
,那么它就会完成。
答案 0 :(得分:6)
在致电std::cout<<data.rdbuf()
期间,std::cout
无法读取data
的{{1}}中的任何字符,因为读取位置已经在文件末尾以前的输出; accordingly,这会在filebuf
上设置failbit
,并且在此状态被清除之前,任何其他输出也将失败(即您的最后一行基本上被忽略)。
std::cout
不会导致std::cout<<data.str()<<std::endl;
进入失败状态,因为cout
返回基础字符串的副本,无论读取位置在哪里(无论如何都是混合模式字符串流)。