请帮助我理解streambuf、stringbuf和stringstream之间的区别

Please help me to understand the difference between streambuf, stringbuf and stringstream?

本文关键字:stringstream 之间 区别 stringbuf 帮助 streambuf      更新时间:2023-10-16

请有人帮我弄清楚"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?提前谢谢。

stringbufstringstream使用,它为流提供缓冲区。streambuf只是stringbuf的基类。如果您需要格式化流的输入/输出(如将数字放入字符串中),那么您需要的是stringstream,否则您希望继续使用简单的string。你永远不应该为streambuf家族而烦恼。

std::stringstream对象包含一个std::stringbuf对象,该对象用作流运算符正在操作的底层数据缓冲区。stringbuf对象基本上是字符串类型的包装器。。。因此,您基本上是通过stringstream接口使用>><<运算符从字符串类型对象中插入和提取。另一方面,当使用stdinstdoutstderrfstream对象时,streambuf对象是用于文件I/O的底层I/O内存缓冲区。如果您查看标准的C风格I/O函数,不同的是您必须如何为sprintf这样的函数提供内存缓冲区才能工作,其中fprintf写入底层托管I/O缓冲区。在C++的情况下,stringbuf对象允许您访问stringstream对象的底层内存缓冲区。

streambuf是stringbuf和stringstream的基类,streambuf具有虚拟方法,实现类可以覆盖这些方法以提供特定的实现。stringstream是一个包含stringbuf的类,因此它的功能与单独使用stringbuf略有不同。

对于那些来自Java的人:

  • stringbuf=>java.nio.ByteBuffer
  • streambuf=>java.nio.Buffer(抽象,与streambuf相同)
  • 字符串流=>java.nio.Channel.newReader(…)+java.nio.Cannel.newWriter(…)

我对stringbuf、streambuf、stringstream、istringstream、ostringstream、iostream、io_base的类层次结构感到满意。。。与2003~2004年发布的Java Nio类(参考Jdk 1.4 Nio)惊人地相同。