ostringstream c что это
Что такое C++ Stringstream и как его использовать?
Строковый объект, созданный из строкового класса, представляет собой структуру данных списка. Список представляет собой серию персонажей, и он ценится как таковой. Строковый объект C ++ имеет множество методов. Однако в нем отсутствуют определенные операции, которые лучше всего использовать, если рассматривать его как поток. Вот где на помощь приходит stringstream. Stringstream — это поток, который можно использовать для:
— Подсчитайте количество слов в строковом объекте
— Получить частоту отдельных слов в строковом объекте
— Преобразование слова в текстовой форме в строковом объекте в число и наоборот
Перемещение символов из строкового объекта в программу C ++ является вводом и представлено объектом строкового потока. Выводится перемещение символов из программы C ++ в строковый объект. Stringstream (то есть sstream) использует классы istringstream и ostringstream. Объект, созданный из istringstream, отвечает за ввод символов в поток строк. Объект, созданный из ostringstream, отвечает за вывод символов из строкового потока в строковый объект.
В этом руководстве объясняется, что такое sstream и как его использовать. Целевой строковый объект является частью программы C ++.
Чтобы выполнить ввод, вывод или и то, и другое в одном сеансе, программа на C ++ должна начинаться с:
Создание объекта Stringstream
Известно, что строковый поток может быть объявлен и применен одновременно в одном операторе. Однако в данном руководстве это не тот подход. В этом руководстве объект строкового потока создается из класса в одном операторе и используется в другом операторе.
Stringstream может быть создан для чтения (ввода). Stringstream может быть создан для записи (вывода). Stringstream может быть реализован как для чтения и записи.
Чтобы создать объект потока для чтения, используйте:
где strm — объект потока; а «in» класса ios_base означает чтение.
Чтобы создать объект потока для записи, используйте:
где strm — объект потока; а «вне» класса ios_base означает запись.
Чтобы создать объект потока для чтения или записи, используйте:
где «ios_base :: in | ios_base :: out », предназначен для чтения или записи.
Входная операция Stringstream
Текст для ввода в строковый поток из строкового объекта может быть выполнен двумя способами: с помощью оператора вставки ( #include
using namespace std ;
stringstream strm1 ( ios_base :: in ) ;
strm1 «We are the world!» ;
string stri2 = «This is the earth!» ;
stringstream strm2 ( ios_base :: in ) ;
stringstream strm3 ( ios_base :: in ) ;
strm3. str ( «Mars is next.» ) ;
string stri4 = «What about Jupiter?» ;
stringstream strm4 ( ios_base :: in ) ;
Строковый объект может быть литералом или идентификатором. Обратите внимание, что в объявлении объекта sstream используется «stringstream», а не «sstream», хотя оба термина означают одно и то же. В директиве include следует использовать термин sstream.
Выходная операция Stringstream
Слово — это любой строковый текст, в котором нет пробела (’’). Вывод из строкового потока означает отправку строкового слова из объекта sstream в строковый объект. Для этого нужен оператор извлечения (>>). Следующая программа отправляет слово из объекта sstream в строковый объект:
Что именно делает stringstream?
Со вчерашнего дня я пытаюсь выучить C ++ и использую этот документ:http://www.cplusplus.com/files/tutorial.pdf (стр. 32). Я нашел код в документе и запустил его. Я попытался ввести Rs 5,5 для цены и целое число для количества, и результат был 0.
Я попытался ввести 5,5 и 6, и вывод был правильным.
Вопрос: Что именно делает команда mystring? Цитата из документа:
«В этом примере мы получаем числовые значения из стандартного ввода
косвенно. Вместо того, чтобы извлекать числовые значения непосредственно из
стандартный ввод, мы получаем строки из стандартного ввода (CIN) в
строковый объект (mystr), а затем мы извлекаем целочисленные значения из
эту строку в переменную типа int (количество). «
У меня сложилось впечатление, что функция будет принимать неотъемлемую часть строки и использовать ее в качестве входных данных.
(Я точно не знаю, как задать вопрос здесь. Я также новичок в программировании)
Спасибо.
Решение
Иногда очень удобно использовать поток строк для преобразования между строками и другими числовыми типами. Использование stringstream похоже на использование iostream так что не бремя учиться.
Строковые потоки могут использоваться как для чтения строк, так и для записи данных в строки. Он в основном работает со строковым буфером, но без реального канала ввода-вывода.
Основные функции-члены класса stringstream:
Вот пример того, как использовать строковые потоки.
istringstream более или менее того же использования.
Подводя итог, струнный поток является удобным способом манипулировать строками как независимое устройство ввода / вывода.
К вашему сведению, отношения наследования между классами:
Другие решения
Ответить на вопрос. stringstream в основном позволяет лечить string объект как stream и использовать все stream функции и операторы на нем.
Я видел, что он используется в основном для форматированного вывода / ввода совершенства.
Один хороший пример будет c++ реализация преобразования номера в потоковый объект.
Также в этом примере string буфер скрыт и не используется явно. Но было бы слишком долго писать о каждом возможном аспекте и сценарии использования.
Примечание: я, вероятно, украл его у кого-то на SO и уточнил, но у меня нет оригинального автора.
istringstream тип читает строка, ostringstream пишет строка, а также stringstream читает и пишет строка.
Я сталкиваюсь с некоторыми случаями, когда это удобно и кратко использовать stringstream.
Случай 1
предполагать a а также b комплексные числа, выраженные в строковом формате, мы хотим получить результат умножения a а также b также в строковом формате. Код выглядит следующим образом:
случай 2
Это также из проблема кода что требует от вас упростить заданную строку пути, одно из решений с использованием stringstream самое элегантное, что я видел:
Без использования stringstream было бы сложно написать такой лаконичный код.
Первым токеном был RS, который не удалось преобразовать в int оставляя ноль для myprice, и мы все знаем, что ноль раз что-либо дает.
Когда вы только ввели значения int во второй раз, все работало так, как вы ожидали.
Это была ложная RS, которая вызвала сбой вашего кода.
В чем разница между istringstream, ostringstream и stringstream? / Почему бы не использовать stringstream в каждом случае?
наконец, есть ли что-то плохое в этом (вместо использования потока вообще):
7 ответов
лично я нахожу очень редким, что я хочу выполнять потоковую передачу в один и тот же поток строк.
обычно я хочу либо инициализировать поток из строки, а затем проанализировать его; или передать вещи в поток строк, а затем извлечь результат и сохранить его.
если вы потоковое и из того же потока, вы должны быть очень осторожны с состоянием потока и потоковых позиций.
здесь может будет некоторое улучшение производительности, но я бы не смотрел на это в первую очередь.
нет ничего плохого в том, что вы написали. Если вы обнаружите, что он работает недостаточно хорошо, вы можете профилировать другие подходы, иначе придерживайтесь того, что яснее всего. Лично я бы просто пошел на:
нет ничего плохого в том, чтобы просто использовать строку, пока она выполняет то, что вы хотите. Если вы просто складываете строки вместе, это легко и работает нормально. Если вы хотите отформатировать другие виды данных, a stringstream будет поддержите это, и строка в основном не будет.
в большинстве случаев вам не понадобятся как входные, так и выходные данные в одном stringstream, поэтому используйте std::ostringstream и std::istringstream явно делает ваше намерение ясным. Это также предотвращает случайное ввод неправильного оператора ( vs >> ).
когда вам нужно выполнить обе операции в одном потоке, вы, очевидно, будете использовать версию общего назначения.
проблемы с производительностью будут наименьшей из ваших проблем здесь, ясность является основным преимущество.
наконец, нет ничего плохого в использовании string append, поскольку вам нужно создавать чистые строки. Вы просто не можете использовать это для объединения чисел, как вы можете в таких языках, как perl.
PS: ничего плохого, просто проблемы с производительностью.
предположительно, когда для вашей операции подходит только вставка или только извлечение, вы можете использовать одну из версий с префиксом » i » или «o», чтобы исключить нежелательную операцию.
Если это не важно, то вы можете использовать ввода-вывода версии.
конкатенации ты показываешь вполне допустимо. Хотя конкатенация с использованием stringstream возможна, это не самая полезная функция stringstreams, которая должна иметь возможность вставлять и извлекать POD и абстрактные типы данных.
зачем открывать файл для чтения и записи, если вам нужно только читать из него, например?
Что делать, если несколько процессов, необходимых для чтения из одного файла?
Класс ostrstream
Описывает объект, управляющий вставкой элементов и закодированных объектов в буфер потока класса strstreambuf.
Синтаксис
Remarks
Этот класс устарел. Вместо него рекомендуется использовать ostringstream или wostringstream.
Конструкторы
Функции элементов
Требования
Заголовок: strstream>
Пространство имен: std
ostrstream::freeze
Делает буфер потока недоступным для операций с буфером потока.
Параметры
Комментарии
Функция-член вызывает rdbuf — Freeze(_ фризеит).
Пример
ostrstream::ostrstream
Параметры
count
Размер буфера в байтах.
_Mode
Режим ввода-вывода буфера. См. раздел ios_base::openmode для получения дополнительной информации.
Комментарии
ostrstream::pcount
Возвращает число элементов, записанных в управляемую последовательность.
Возвращаемое значение
Число элементов, записанных в управляемую последовательность.
Комментарии
Пример
ostrstream::rdbuf
Возвращает указатель на объект strstreambuf, связанный с потоком.
Возвращаемое значение
Указатель на объект strstreambuf, связанный с потоком.
Комментарии
Пример
См. пример использования в разделе strstreambuf::pcount.
ostrstream::str
Вызывает freeze, затем возвращает указатель на начало управляемой последовательности.
Возвращаемое значение
Указатель на начало управляемой последовательности.
Комментарии
Пример
std:: basic_ostringstream
Compiler support | ||||
Freestanding and hosted | ||||
Language | ||||
Standard library headers | ||||
Named requirements | ||||
Feature test macros (C++20) | ||||
Language support library | ||||
Concepts library (C++20) | ||||
Diagnostics library | ||||
General utilities library | ||||
Strings library | ||||
Containers library | ||||
Iterators library | ||||
Ranges library (C++20) | ||||
Algorithms library | ||||
Numerics library | ||||
Localizations library | ||||
Input/output library | ||||
Filesystem library (C++17) | ||||
Regular expressions library (C++11) | ||||
Atomic operations library (C++11) | ||||
Thread support library (C++11) | ||||
Technical specifications | ||||
Symbols index | ||||
External libraries |
The class template std::basic_ostringstream implements output operations on string based streams. It effectively stores an instance of std::basic_string and performs output operations to it.
Two specializations for common character types are also defined: