Помогите мне понять разницу между 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.