stringstream.rdbuf导致cout失败

Ano*_*ity 5 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;
Run Code Online (Sandbox Code Playgroud)

该计划在没有最后一场比赛的情况下悄然退出.到底是怎么回事?如果我改变了最后一个.rdbuf(),.str()那么它就完成了.

use*_*267 6

在该通话std::cout<<data.rdbuf(),std::cout是无法读取任何字符datafilebuf,因为读取位置已经在前面的输出后的文件的末尾; 因此,这将failbit打开std::cout,直到此状态被清除,任何进一步的输出也将失败(即您的最后一行基本上被忽略).

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