请帮我理解streambuf,stringbuf和stringstream之间的区别?

时间:2011-06-17 20:30:46

标签: c++

请有人帮助我理解“streambuf,stringbuf和stringstream”之间的区别。

void f1(std::string const& text)
{
     std::stringstream           inStream(text);
    cout<<inStream.str()<<endl;
 }

或者如果我写

void f2(std::string const& text)
{
    std::stringbuf           inStream(text);
    cout<<inStream.str()<<endl;
 }

两者都显示相同的结果。我什么时候应该使用stringbuf或stringstream?提前谢谢。

4 个答案:

答案 0 :(得分:22)

stringbuf使用stringstream,它为流提供缓冲区。 streambuf只是stringbuf的基类。如果您需要将格式化的输入/输出输入/输出流(例如将数字放入字符串中),您想要的是stringstream,否则您希望继续使用简单的string。你永远不需要自己打扰streambuf家庭。

答案 1 :(得分:7)

std::stringstream对象包含一个std::stringbuf对象,该对象充当流运营商正在操作的基础数据缓冲区。 stringbuf对象基本上是字符串类型的包装...所以你基本上是使用>><<运算符通过{{从字符串类型对象中插入和提取1}}接口。另一方面,stringstream对象是使用streambufstdinstdout或者stderr时使用的基础I / O内存缓冲区,用于文件I / O. fstream个对象。如果你看一下标准的C风格的I / O函数,不同的就是你必须为像sprintf这样的函数提供内存缓冲区才能工作,其中-fprintf写入底层函数托管I / O缓冲区。对于C ++,stringbuf对象允许您访问stringstream对象的底层内存缓冲区。

答案 2 :(得分:2)

对于那些来自Java的人:

  • stringbuf =&gt; java.nio.ByteBuffer中
  • streambuf =&gt; java.nio.Buffer(抽象,与streambuf相同)
  • stringstream =&gt; java.nio.Channel.newReader(...)+ java.nio.Channel.newWriter(...)

我被赋予了stringbuf,streambuf,stringstream,istringstream,ostringstream,iostream,io_base等的类层次结构与2003〜2004年发布的Java Nio类的惊人相同(参考Jdk 1.4 Nio)。

答案 3 :(得分:1)

streambuf是stringbuf和stringstream的基类,streambuf具有实现类可以覆盖以提供特定实现的虚方法。 stringstream是一个包含stringbuf的类,因此可以比单独的stringbuf具有稍微不同的功能。