Stringstream это 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 что это
Этот раздел является переводом туториала C++ Language
Примеры программ предыдущих разделов обеспечивали незначительное взаимодействие с пользователем, если оно вообще было. Они просто отображали значения на экране, но стандартная библиотека предоставляет множество дополнительных способов взаимодействия с пользователем через функции ввода / вывода. В этом разделе будет представлено краткое введение в некоторые из наиболее полезных. C++ использует удобную абстракцию, называемую потоками, для выполнения операций ввода и вывода на последовательных носителях, таких как экран, клавиатура или файл.
Стандартная библиотека определяет несколько потоков, которые могут быть использованы для доступа к стандартным объектам из окружения во время работы программы:
поток | описание |
cin | стандартный поток ввода |
cout | стандартный поток вывода |
cerr | стандартный поток ошибок (вывод) |
clog | стандартный поток журналирования (вывод) |
Мы рассмотрим более подробно только cout и cin (стандартные потоки вывода и ввода). cerr и clog также являются потоками вывода, поэтому они по сути работают как cout, с той лишь разницей, что они идентифицируют потоки для определенных целей: сообщения об ошибках и журналирование; они во многих случаях фактически делают одно и то же: они печатают на экране, хотя они также могут быть индивидуально перенаправлены.
Стандартный вывод (cout)
В большинстве программных сред стандартный поток вывода по умолчанию выводится на экран, объектом C++ для доступа к нему является cout.
Для операций форматированного вывода cout используется вместе с оператором вставки, который записывается как
Для операций форматированного ввода cin используется вместе с операцией извлечения, который записывается как >> (т.е. два знака «больше»). Далее следует переменная, в которой должны хранится извлеченные данные. Например:
В первом выражении объявляется переменная age типа int, а во втором из cin извлекается значение, которое будет в ней храниться. Эта операция приводит к ожиданию ввода из cin. Обычно это означает, что программа будет ожидать, пока пользователь введет некоторую последовательность с клавиатуры. В этом случае стоит отметить, что введенные символы будут переданы программе после нажатия клавиши ENTER (или RETURN). При достижении операции извлечения из cin, программа будет ждать настолько долго, насколько это необходимо, пока не будет произведен ввод.
Операция извлечения из cin использует тип переменной после >> для определения того, как интерпретировать символы из ввода; если это число, ожидаемым форматом ввода будем последовательность цифр, если строка, то последовательность символов и т.д.
Как вы видите, извлечение из cin делает задачу ввода данных из стандартного ввода довольно простой. Но этот метод имеет также большой недостаток. Что произойдет в примере выше, если пользователь введет что-то, что не может быть интерпретировано как целое число? В этом случае операция извлечения завершится неудачно. И это, по умолчанию, позволяет программе продолжить работу, не устанавливая значение переменной i, что приведет к неопределенному результату, если значение i используется позже.
Это плохое поведение программы. Большинство программ должны вести себя так, как ожидается, независимо от того, что вводит пользователь, занимаясь обработкой неправильных значений. Только очень простые программы могут зависеть от значений, введенных из cin, без соответствующей проверки. Немного позже мы увидим, как stringstream можно использовать для контроля за пользовательским вводом.
Извлечением из cin можно запрашивать более одного элемента в одном выражении:
В обоих случаях от пользователя требуется ввод двух значений: одно для переменной a, а другое для переменной b. Для разделения двух последовательных операций ввода используется любой тип разделителей. Это могут быть пробелы, символы табуляции или новой строки.
cin и строки
Оператор извлечения может быть применен к cin для извлечения строк символов так же, как и для фундаментальных типов данных:
Однако извлечение из cin считает разделители (пробелы, символы табуляции и новой строки. ) окончанием извлекаемого значения. Таким образом, извлечение строки означает извлечение одного слова, а не фразы или предложения.
Для получения из cin целой строки имеется функция getline, которая принимает поток (cin) первым аргументом и строковую переменную вторым. Например:
Обратите внимание на то, что в обоих вызовах getline мы используем один и тот же идентификатор (mystr). Во втором случае программа просто замещает предыдущее содержимое новым, которое введено.
Стандартным поведением, которое большинство пользователей ожидают от консольной программы, это запрос ввода от пользователя каждый раз, пользователь заполняет поле и затем нажимает ENTER (RETURN). Поэтому, если у вас нет веской причины не делать этого, вы всегда должны использовать getline для получения ввода в консольных программах вместо извлечения из cin.
stringstream
Стандартный заголовочный файл определяет тип stringstream, который позволяет обрабатывать строку как поток, и это позволяет использовать операции вставки/извлечения в/из строки так же, как если бы она была потоком cin или cout. Эта возможность особенно полезна для преобразования строк в числовые значения и наоборот. Например, чтобы извлечь целое число из строки, мы можем написать:
Здесь объявляется переменная типа string и инициализируется значением «1204», и переменная типа int. Затем в третьей строке эта переменная используется для извлечения из потока, созданного из строки. Эта часть кода сохраняет числовое значение 1204 в переменной myint.
В этом примере мы получаем числовые значения из стандартного ввода косвенно: вместо извлечения числовых значений непосредственно из cin мы получаем строки из него в строковый объект (mystr), затем мы извлекаем значения из этой строки в переменные price и quantity. Так как это числовые значения, с ними можно производить арифметические операции, такие как умножение, для получения итоговой цены.
Используя этот подход для получения целых строк и извлечения их содержимого, мы отделяем процесс получения пользовательского ввода от его интерпретации как данных, позволяя процессу ввода быть тем, чего ожидает пользователь, и в то же время получить больше контроля над преобразованием его содержимого в полезные данные.
Что именно делает 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, которая вызвала сбой вашего кода.
О строковом форматировании в современном C++
Доброго времени суток! В этой статье я хотел бы рассказать о существующих возможностях строкового форматирования в современном C++, показать свои наработки, которые я уже несколько лет использую в реальных проектах, а также сравнить производительность различных подходов к строковому форматированию.
Строковое форматирование — это операция, позволяющая получить результирующую строку из строки-шаблона и набора аргументов. Строка-шаблон содержит текст, в который включены местозаполнители (placeholders), вместо которых подставляются аргументы.
Для наглядности небольшой пример:
Здесь:
Строка-шаблон: I have %d apples and %d oranges, so I have %d fruits
Местозаполнители: %d, %d, %d
Аргументы: apples, oranges, apples + oranges
При выполнении примера, получаем результирующую строку
Теперь посмотрим, что же нам предоставляет C++ для строкового форматирования.
Наследие C
Строковое форматирование в C осуществляется с помощью семейства функций Xprintf. С тем же успехом, мы можем воспользоваться этими функциями и в C++:
Это довольно неплохой способ форматирования, несмотря на кажущуюся неуклюжесть:
Но, конечно, не обошлось и без недостатков:
Функция std::to_string()
Начиная с C++11 в стандартной библиотеке появилась функция std::to_string(), которая позволяет преобразовать передаваемое значение в строку. Функция работает не со всеми типами аргументов, а только со следующими:
Класс std::stringstream
Класс std::stringstream — это основной способ строкового форматирования, который нам предоставляет C++:
Строго говоря, использование std::stringstream не является в полной мере строковым форматированием, так как вместо местозаполнителей мы вставляем в строку-шаблон аргументы. Это допустимо в простейших случаях, но в более сложных существенно ухудшает читаемость кода:
Объект std::sringstream позволяет реализовать несколько интересных оберток, которые могут понадобится в дальнейшем.
Преобразование «чего угодно» в строку:
Преобразование строки во «что угодно»:
Преобразование строки во «что угодно» с проверкой:
Также, можно написать пару оберток для удобного использования std::stringstream в одну строку.
Использование объекта std::stringstream для каждого аргумента:
Использование одного объекта std::stringstream для всей строки:
Забегая вперед, оказывается, что производительность std::to_string в 3-4 раза выше, чем у to_string, реализованной с помощью std::stringstream. Поэтому, логично будет использовать std::to_string для подходящих типов, а для всех остальных использовать шаблонную to_string:
Библиотека boost::format
Набор библиотек boost является мощным средством, отлично дополняющим средства языка C++ и стандартной библиотеки. Строковое форматирование представлено библиотекой boost::format.
Поддерживается указание как типовых местозаполнителей:
Единственный недостаток boost::format — низкая производительность, это самый медленный способ строкового форматирования. Также этот способ неприменим, если в проекте нельзя использовать сторонние библиотеки.
Итак, получается, что C++ и стандартная библиотека не предоставляют нам удобных средств строкового форматирования, поэтому будем писать что-то свое.
Обертка над vsnprintf
Попробуем написать обертку над Xprintf функцией, выделяя достаточно памяти и передавая произвольное количество параметров.
Для выделения памяти будем использовать следующую стратегию:
Для передачи параметров будем использовать механизм stdarg и функцию vsnprintf.
Шаблон с переменным количеством аргументов (Variadic Template)
В C++ начиная с C++11 появилась возможность использовать шаблоны с переменным количеством аргументов (Variadic Templates).
Такие шаблоны можно использовать при передаче аргументов в функцию форматирования. Также, нам больше не нужно заботиться о типах аргументов, так как мы можем использовать шаблонную to_string, которая была реализована ранее. Поэтому будем использовать порядковые местозаполнители.
Для получения всех аргументов отделяем первый аргумент, преобразуем его в строку, запоминаем и рекурсивно повторяем эту операцию. В случае отсутствия аргументов или при их окончании (конечная точка рекурсии) выполняем разбор строки-шаблона, подстановку аргументов и получаем результирующую строку.
Таким образом, у нас есть все, чтобы полностью реализовать функцию форматирования: парсинг строки-шаблона, сбор и преобразование в строку всех параметров, подстановку параметров в строку-шаблон и получение результирующей строки:
Алгоритм получился достаточно эффективным, работает за один проход по строке форматирования. В случае, если вместо местозаполнителя не удается вставить аргумент, он остается без изменений, исключений не генерируется.
Сравнение производительности
Сравнение производительности to_string и std::to_string, миллисекунд на миллион вызовов
int, мс | long long, мс | double, мс | |
---|---|---|---|
to_string | 681 | 704 | 1109 |
std::to_string | 130 | 201 | 291 |
Сравнение производительности функций форматирования, миллисекунд на миллион вызовов
мс | |
---|---|
fstr | 1308 |
sstr | 1243 |
format | 788 |
boost::format | 2554 |
vtformat | 2022 |
Спасибо за внимание. Замечания и дополнения приветствуются.
std:: basic_stringstream
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_stringstream implements input and output operations on string based streams. It effectively stores an instance of std::basic_string and performs the input and output operations on it.
Two specializations for common character types are also defined: