Spec-Zone.ru › C++

std::quoted

Определено в заголовке <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, построенную следующим образом:
a) Сначала символ 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>>, в соответствии со следующими правилами:
a) Если первый извлеченный символ не равен 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 - символ, используемый в качестве символа экранирования, по умолчанию \

Значение результата

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

Исключения

Выбрасывает 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]

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/manip/quoted

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API