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, ведёт себя как функция форматированного вывода, которая вставляет в 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() либо в конец последовательности (если в out.flags() установлен ios_base::left), либо в начало последовательности (во всех остальных случаях). Наконец, выводит каждый символ результирующей последовательности так, как если бы был вызван 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/cpp/io/manip/quoted

Spec-Zone.ru

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