请有人帮助我理解“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?提前谢谢。
答案 0 :(得分:22)
stringbuf
使用stringstream
,它为流提供缓冲区。 streambuf
只是stringbuf
的基类。如果您需要将格式化的输入/输出输入/输出流(例如将数字放入字符串中),您想要的是stringstream
,否则您希望继续使用简单的string
。你永远不需要自己打扰streambuf
家庭。
答案 1 :(得分:7)
std::stringstream
对象包含一个std::stringbuf
对象,该对象充当流运营商正在操作的基础数据缓冲区。 stringbuf
对象基本上是字符串类型的包装...所以你基本上是使用>>
和<<
运算符通过{{从字符串类型对象中插入和提取1}}接口。另一方面,stringstream
对象是使用streambuf
,stdin
,stdout
或者stderr
时使用的基础I / O内存缓冲区,用于文件I / O. fstream
个对象。如果你看一下标准的C风格的I / O函数,不同的就是你必须为像sprintf
这样的函数提供内存缓冲区才能工作,其中-fprintf
写入底层函数托管I / O缓冲区。对于C ++,stringbuf
对象允许您访问stringstream
对象的底层内存缓冲区。
答案 2 :(得分:2)
对于那些来自Java的人:
我被赋予了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具有稍微不同的功能。