<<<<< s.str()和<< s.rdbuf()

时间:2014-10-29 23:09:49

标签: 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!

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

1 个答案:

答案 0 :(得分:5)

插入&#34;插入&#34;如果没有可以从streambuffer中提取字符,streambuffers设置failbit - [ostream.inserters] / 9:

  

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

而输出字符串的插入操作符显然不会考虑写入的字符数。

这似乎是因为插入一个streambuffer&#34; forwards&#34; streambuffer进入流 - 如果没有字符可以被提取,那么streambuffer本身就会出现错误,这个错误应该由stream错误状态表示。输出空流是一个例外,在创建此规则时,可能认为这个例外不够重要。