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 для обеспечения удобства перегрузки ostreamistream, если уместно), по тем же линиям, что и 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.

enter image description here


ostream более общий (подклассы поддерживают запись в разные места),ostringstream специфический запись string


ostream нет rdbuf реализация за ним, тогда как ostringstream использует stringbuf. Пробовали документацию?