Namespaces
Variants

std:: quoted

From cppreference.net
< cpp ‎ | io ‎ | manip
Определено в заголовочном файле <iomanip>
template < class CharT >

/*unspecified*/ quoted ( const CharT * s,

CharT delim = CharT ( '"' ) , CharT escape = CharT ( ' \\ ' ) ) ;
(1) (начиная с C++14)
template < class CharT, class Traits, class Allocator >

/*unspecified*/ quoted ( const std:: basic_string < CharT, Traits, Allocator > & s,

CharT delim = CharT ( '"' ) , CharT escape = CharT ( ' \\ ' ) ) ;
(2) (начиная с C++14)
template < class CharT, class Traits >

/*unspecified*/ quoted ( std:: basic_string_view < CharT, Traits > s,

CharT delim = CharT ( '"' ) , CharT escape = CharT ( ' \\ ' ) ) ;
(3) (начиная с C++17)
template < class CharT, class Traits, class Allocator >

/*unspecified*/ quoted ( std:: basic_string < CharT, Traits, Allocator > & s,

CharT delim = CharT ( '"' ) , CharT escape = CharT ( ' \\ ' ) ) ;
(4) (начиная с C++14)

Позволяет вставлять и извлекать строки в кавычках, такие как те, что встречаются в CSV или XML .

1-3) При использовании в выражении out << quoted ( s, delim, escape ) , где out является выходным потоком с char_type равным CharT и, для перегрузок (2,3), traits_type равным Traits , ведет себя как FormattedOutputFunction , которая вставляет в out последовательность символов seq , сконструированную следующим образом:
а) Сначала символ delim добавляется в последовательность.
b) Затем каждый символ из s , за исключением случая, когда следующий выводимый символ равен delim или равен escape (определяется с помощью traits_type :: eq потока), тогда сначала добавляет дополнительную копию escape .
c) В конце, delim снова добавляется в seq .
Затем, если seq. size ( ) < out. width ( ) , добавляет out. width ( ) - seq. size ( ) копий символа заполнения out. fill ( ) либо в конец последовательности (если установлен ios_base :: left в out. flags ( ) ), либо в начало последовательности (во всех остальных случаях).
Наконец, выводит каждый символ из результирующей последовательности как если бы вызывался out. rdbuf ( ) - > sputn ( seq, n ) , где n = std:: max ( out. width ( ) , seq. size ( ) ) и out. width ( 0 ) для отмены эффектов std::setw , если они присутствуют.
4) При использовании в выражении in >> quoted ( s, delim, escape ) , где in является входным потоком с char_type равным CharT и traits_type равным Traits , извлекает символы из in , используя std::basic_istream::operator>> , в соответствии со следующими правилами:
а) Если первый извлеченный символ не равен delim (как определено с помощью traits_type::eq потока), то просто выполняется in >> s .
b) В противном случае (если первый символ является разделителем):
1) Отключает флаг skipws на входном потоке.
2) Очищает строку назначения, вызывая s. clear ( ) .
3) Извлекает последовательные символы из in и добавляет их в s , за исключением случаев, когда извлекается escape символ — он игнорируется, и следующий символ добавляется в s . Извлечение прекращается, когда ! in == true или когда встречается неэкранированный delim символ.
4) Отбрасывает последний (неэкранированный) delim символ.
5) Восстанавливает флаг skipws на входном потоке до его исходного значения.

Содержание

Параметры

s - строка для вставки или извлечения
delim - символ, используемый в качестве разделителя, по умолчанию "
escape - символ, используемый в качестве escape-символа, по умолчанию \

Возвращаемое значение

Возвращает объект неуказанного типа, так что описанное поведение имеет место.

Исключения

Выбрасывает std::ios_base::failure если operator >> или operator << выбрасывает исключение.

Примечания

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_quoted_string_io 201304L (C++14) std::quoted

Пример

#include <iomanip>
#include <iostream>
#include <sstream>
void default_delimiter()
{
    const std::string in = "std::quoted() quotes this string and embedded \"quotes\" too";
    std::stringstream ss;
    ss << std::quoted(in);
    std::string out;
    ss >> std::quoted(out);
    std::cout << "Default delimiter case:\n"
                 "read in     [" << in << "]\n"
                 "stored as   [" << ss.str() << "]\n"
                 "written out [" << out << "]\n\n";
}
void custom_delimiter()
{
    const char delim{'$'};
    const char escape{'%'};
    const std::string in = "std::quoted() quotes this string and embedded $quotes$ $too";
    std::stringstream ss;
    ss << std::quoted(in, delim, escape);
    std::string out;
    ss >> std::quoted(out, delim, escape);
    std::cout << "Custom delimiter case:\n"
                 "read in     [" << in << "]\n"
                 "stored as   [" << ss.str() << "]\n"
                 "written out [" << out << "]\n\n";
}
int main()
{
    default_delimiter();
    custom_delimiter();
}

Вывод:

Default delimiter case:
read in     [std::quoted() quotes this string and embedded "quotes" too]
stored as   ["std::quoted() quotes this string and embedded \"quotes\" too"]
written out [std::quoted() quotes this string and embedded "quotes" too]
Custom delimiter case:
read in     [std::quoted() quotes this string and embedded $quotes$ $too]
stored as   [$std::quoted() quotes this string and embedded %$quotes%$ %$too$]
written out [std::quoted() quotes this string and embedded $quotes$ $too]

Смотрите также

(C++20)
сохраняет форматированное представление аргументов в новой строке
(шаблон функции)