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