operator<<,>>(std::basic_string)
Материал из ru.cppreference.net
| Определён в заголовке <string>
|
||
template< class CharT, class Traits, class Allocator >
std::basic_ostream<CharT, Traits>&
operator<<( std::basic_ostream<CharT, Traits>& os,
const std::basic_string<CharT, Traits, Allocator>& str );
|
(1) | |
template< class CharT, class Traits, class Allocator >
std::basic_istream<CharT, Traits>&
operator>>( std::basic_istream<CharT, Traits>& is,
std::basic_string<CharT, Traits, Allocator>& str );
|
(2) | |
1) Ведёт себя как FormattedOutputFunction. После конструирования и проверки объекта-часового, определяет отступ для форматирования вывода.
Затем вставляет каждый символ из результирующей последовательности seq (содержимое str плюс отступ) в выходной поток os как если бы вызовом os.rdbuf()->sputn(seq, n), где n равно std::max(os.width(), str.size())
Наконец, вызывает os.width(0) для отмены эффектов std::setw, если таковые были.
|
Эквивалентно |
(начиная с C++17) |
2) Ведёт себя как FormattedInputFunction. После конструирования и проверки объекта-часового, который может пропускать начальные пробельные символы, сначала очищает
str с помощью str.erase(), затем читает символы из is и добавляет их в str как если бы через str.append(1, c), до тех пор, пока не выполнится одно из следующих условий:
Nсчитано символов, гдеNравноis.width()еслиis.width() > 0, в противном случаеNравноstr.max_size(),- в потоке
isвозникло состояние конца файла, или std::isspace(c, is.getloc())равноtrueдля следующего символаcвis(этот пробельный символ остаётся во входном потоке).
Если ни один символ не был извлечён, то std::ios::failbit устанавливается на is, что может вызвать исключение std::ios_base::failure.
is.width(0) для отмены эффектов std::setw, если таковые были. Исключения
1)
Может выбросить
std::ios_base::failure
если во время вывода возникло исключение.
2)
Может выбросить
std::ios_base::failure
если не извлечено ни одного символа из
is
(например, поток находится в конце файла или состоит только из пробельных символов), или если во время ввода возникло исключение.
Параметры
| os | - | поток вывода символов |
| is | - | поток ввода символов |
| str | - | строка для вставки или извлечения |
Возвращаемое значение
1)
os
2)
is
Пример
Запустить этот код
#include <iostream> #include <sstream> #include <string> int main() { std::string greeting = "Hello, whirled!"; std::istringstream iss(greeting); std::string hello_comma, whirled, word; iss >> hello_comma; iss >> whirled; std::cout << greeting << '\n' << hello_comma << '\n' << whirled << '\n'; // Reset the stream iss.clear(); iss.seekg(0); while (iss >> word) std::cout << '+' << word << '\n'; }
Вывод:
Hello, whirled! Hello, whirled! +Hello, +whirled!
Отчеты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 25 | C++98 | n было меньшим из os. width ( ) и str. size ( ) | n является большим из них |
| LWG 90 | C++98 |
std::
isspace
(
c, getloc
(
)
)
использовалось для проверки
пробелов, но
getloc
не объявлен в
<string>
|
заменено
getloc
(
)
на is. getloc ( ) |
| LWG 91 | C++98 |
operator>>
не вел себя
как FormattedInputFunction |
ведет себя как
FormattedInputFunction |
| LWG 211 | C++98 |
operator>>
не устанавливал
failbit
если ни один символ не извлекался
|
устанавливает
failbit
|
| LWG 435 | C++98 |
символы вставлялись с помощью
os.
rdbuf
(
)
-
>
sputn
(
str.
data
(
)
, n
)
,
и решение LWG issue 25 сделало поведение неопределенным, если os. width ( ) больше чем str. size ( ) |
определяет заполнение
сначала и вставляет заполненную последовательность символов вместо этого |
| LWG 586 | C++98 |
operator<<
не вел себя
как FormattedOutputFunction |
ведет себя как
FormattedOutputFunction |
Смотрите также
|
(C++17)
|
выполняет потоковый вывод для string views
(шаблон функции) |