<< s.str()和<< s.rdbuf()之间的区别

Gab*_*iel 4 c++ iostream stringstream ofstream cstdio

有人可以解释微妙的区别:

ofstream f("test.txt")
std::stringstream s;
s<<"";
f << s.rdbuf();
f.good() // filestream is bad!!


ofstream f("test.txt")
std::stringstream s;
s<<"";
f << s.str();
f.good() // is still ok!
Run Code Online (Sandbox Code Playgroud)

我主要使用.rdbuf()将字符串流推送到文件中(因为它更有效),但是如果字符串流为空而不是文件流变坏...?这不是傻瓜吗?我想我不太明白<< s.rdbuf()......

Col*_*mbo 5

如果没有可以从streambuffer中提取字符,那么"插入"streambuffers的插入运算符会设置failbit - [ostream.inserters]/9:

如果函数没有插入任何字符,则调用setstate(failbit) (可能抛出ios_base:: failure(27.5.5.4)).

而输出字符串的插入运算符显然不考虑写入的字符数.

这似乎是因为插入一个streambuffer将streambuffer"转发"到流中 - 如果没有字符可以被提取,那么streambuffer本身就会出现错误,这个错误应该由stream错误状态表示.输出空流是一个例外,在创建此规则时,可能认为这个例外不足以考虑.