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. Пробовали документацию?