5

有人可以解释以下细微差别:

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!

我主要使用 .rdbuf() 将字符串流推送到文件(因为它更有效),但是如果字符串流为空,则文件流会变坏......?这不是愚蠢吗?我觉得我不太明白<< s.rdbuf()...

4

1 回答 1

6

如果无法从流缓冲区中提取字符 - [ostream.inserters]/9,“插入”流缓冲区的插入运算符将设置失败位:

如果函数没有插入字符,它会调用setstate(failbit) (可能会抛出ios_base:: failure(27.5.5.4))。

而输出字符串的插入运算符显然没有考虑写入的字符数。

这似乎是因为插入流缓冲区会将流缓冲区“转发”到流中 - 如果无法提取任何字符,则最肯定的是流缓冲区本身存在错误,并且该错误应由流错误状态表示。输出空流是一个例外,在创建此规则时可能被认为不够重要,无法考虑。

于 2014-10-29T23:19:03.603 回答