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]
См. также
|
(C++20) | сохраняет форматированное представление аргументов в новой строке (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/manip/quoted