stringstream.rdbuf导致cout失败

时间:2016-02-08 01:48:56

标签: c++

当我在某个时刻添加一个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(),那么它就会完成。

1 个答案:

答案 0 :(得分:6)

在致电std::cout<<data.rdbuf()期间,std::cout无法读取data的{​​{1}}中的任何字符,因为读取位置已经在文件末尾以前的输出; accordingly,这会在filebuf上设置failbit,并且在此状态被清除之前,任何其他输出也将失败(即您的最后一行基本上被忽略)。

std::cout不会导致std::cout<<data.str()<<std::endl;进入失败状态,因为cout返回基础字符串的副本,无论读取位置在哪里(无论如何都是混合模式字符串流)。