Помогите мне понять разницу между streambuf, stringbuf и stringstream?

Пожалуйста, помогите мне разобраться в различии между "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? Спасибо заранее.

Ответы

Ответ 1

A stringbuf используется stringstream, он предоставляет буфер для потока. A streambuf - это только базовый класс для a stringbuf. Вы хотите stringstream, если вам нужен форматированный ввод/вывод в/из потока (например, помещение чисел в строку), в противном случае вы хотите продолжить использовать простой string. Вам никогда не придется беспокоиться о семье streambuf.

Ответ 2

Объект

A std::stringstream содержит объект std::stringbuf, который служит в качестве базового буфера данных, на котором работают операторы потока. Объект stringbuf в основном представляет собой оболочку типа string... поэтому вы в основном вставляете и извлекаете из объекта типа string с помощью операторов >> и << через интерфейс stringstream. Объектом streambuf с другой стороны является основной буфер памяти ввода-вывода, используемый для ввода/вывода файлов при использовании объектов stdin, stdout, stderr или fstream. Если вы посмотрели на стандартные функции ввода-вывода C-стиля, разные были бы похожи на то, как вы должны предоставить буфер памяти для функции типа sprintf для работы, где-как fprintf записывает в базовый управляемый ввод-вывод буфер. В случае С++ объект stringbuf позволяет получить доступ к базовому буферу памяти для объекта stringstream.

Ответ 3

Для тех из вас, кто из Java:

  • stringbuf = > java.nio.ByteBuffer
  • streambuf = > java.nio.Buffer(абстрактный, такой же, как streambuf)
  • stringstream = > java.nio.Channel.newReader(...) + java.nio.Channel.newWriter(...)

Я был удивлен тем, что иерархия классов stringbuf, streambuf, stringstream, istringstream, ostringstream, iostream, io_base... была удивительно такой же, как и классы Java Nio, выпущенные примерно с 2003 по 2004 год (см. Jdk 1.4 Nio).

Ответ 4

streambuf является базовым классом для stringbuf и stringstream, а streambuf имеет виртуальные методы, которые реализующие классы могут переопределять для обеспечения конкретных реализаций. stringstream - это класс, который содержит stringbuf, и поэтому может иметь несколько отличную функциональность, чем только stringbuf.