C++ в чем разница между ostream и ostringstream?
в чем разница между ostream и ostringstream? Когда вы будете использовать одно против другого?
4 ответов
короче говоря: ostringstream
предоставляет streambuf
, ostream
требует, чтобы пользователь предоставил его.
чтобы понять последствия, необходимо понять немного
как работают потоки (и в отличие от некоторых других плакатов, я не уверен, что
есть хороший explination этого в Интернете). Основная абстракция
из ostream
форматирование текстового вывода. Вы даете ему int
или a
double
(или определенный пользователем тип-подробнее об этом позже), и это
преобразовать его в поток символы, типа char
. Что он делает
с этим потоком зависит от streambuf
который прикреплен к нему;
это пример шаблона стратегии, где streambuf
это
абстрактный базовый класс стратегии[1]. Стандарт предусматривает два
реализации streambuf
, filebuf
и stringbuf
; на практике,
во всех, кроме самых тривиальных приложений, вы, вероятно, будете иметь некоторые из них
вы реализуете себя.
при выводе, вы всегда использовать ostream
, это класс за который этот
<<
определены операторы. Вы форматируете свои данные в поток
персонажей, и вам все равно, где заканчивается поток.
при создании экземпляра: если вы создаете ostream
, вы должны предоставить
он с streambuf
себя. Чаще всего вы создадите
ofstream
или ostringstream
. Это оба класса" удобства",
которые происходят от ostream
, и предоставить streambuf
на его (filebuf
и stringbuf
, как это происходит). Фактически, все они делают
обеспечьте необходимое streambuf
(который влияет на конструктор и
деструктор, и не очень много еще); в случае ofstream
там
также несколько дополнительных функций которые препровождают к дополнительным функциям внутри
the filebuf
интерфейс.
это обычно (но ни в коем случае не требуется) , когда вы определяете свой собственный
streambuf
для обеспечения удобства перегрузки ostream
(и
istream
, если уместно), по тем же линиям, что и ofstream
или
ostringstream
.
таким же образом, при создании экземпляра обычно используется один из
"удобство" производных классов, а не использовать ostream
напрямую
и обеспечить свой собственный streambuf.
и если все это кажется сложным: классы iostream использовать только
обо всех возможностях C++ (виртуальных функциях, шаблонах и
функции перегрузки все играют важную роль). Если вы просто
изучая C++, не беспокойтесь об этом: просто используйте ofstream
или
ostringstream
когда вы создаете экземпляр, но пройти вокруг
ссылки ostream
. И как вы узнаете о таких методах, как virtual
функции, шаблоны и перегрузка операторов, возврат в iostreams
чтобы понять роль, которую они играют в создании более гибкого кода.
[1] по различным причинам, std::streambuf
на самом деле не абстрактно. Но
реализации виртуальных функций в нем бесполезны;
извлечение всегда возвращает EOF, и вставка всегда терпит неудачу.
вот хороший вид иерархии наследования для классов потока C++ :)
этой статьи в разделе
3.1 ofstream and ostringstream
есть то, что вам нужно.
по сути:ofstream
класс позволяет write data to files using stream operations
и ostringstream
класс позволяет write to strings
.
ostream
более общий (подклассы поддерживают запись в разные места),ostringstream
специфический запись string
ostream
нет rdbuf
реализация за ним, тогда как ostringstream
использует stringbuf. Пробовали документацию?