30 Input/output library [input.output]

30.7 Formatting and manipulators [iostream.format]

30.7.8 Quoted manipulators [quoted.manip]

[ Note: Манипуляторы с кавычками обеспечивают вставку и извлечение строк в кавычках (например, в форматах XML и CSV). Цитированные манипуляторы полезны для обеспечения того, чтобы содержимое строки со встроенными пробелами оставалось неизменным, если оно вставлено и затем извлечено с помощью потокового ввода-вывода. ] end note

template <class charT> unspecified quoted(const charT* s, charT delim = charT('"'), charT escape = charT('\\')); template <class charT, class traits, class Allocator> unspecified quoted(const basic_string<charT, traits, Allocator>& s, charT delim = charT('"'), charT escape = charT('\\')); template <class charT, class traits> unspecified quoted(basic_string_view<charT, traits> s, charT delim = charT('"'), charT escape = charT('\\'));

Returns: Объект неопределенного типа, такой что if out является экземпляром basic_­ostream с типом члена, char_­type таким же, как charT и с типом члена traits_­type, который во второй и третьей формах совпадает с traits, тогда выражение out << quoted(s, delim, escape) ведет себя как a formatted output function of out. Это формирует последовательность символов seq, изначально состоящую из следующих элементов:

  • delim.

  • Каждый персонаж в s. Если выводимый символ равен escape или delim, как определено traits_­type​::​eq, первый вывод escape.

  • delim.

Позвольте x быть количество элементов первоначально в seq. Затем определяется заполнение, seq как описано в [ostream.formatted.reqmts], seq вставляется, как если бы при вызове out.rdbuf()->sputn(seq, n), где n больше из out.width() и x, и out.width(0) вызывается. Выражение out << quoted(s, delim, escape) должно иметь тип basic_­ostream<charT, traits>& и значение out.

template <class charT, class traits, class Allocator> unspecified quoted(basic_string<charT, traits, Allocator>& s, charT delim = charT('"'), charT escape = charT('\\'));

Returns: Объект неопределенного типа, такой что:

  • Если in это экземпляр basic_­istream с типами членов char_­type и traits_­type то же самое, что charT и traits, соответственно, тогда выражение in >> quoted(s, delim, escape) ведет себя так, как если бы оно извлекало следующие символы из in using operator>>(basic_­istream<charT, traits>&, charT&) ([istream.extractors]), которое может throw ios_­base​::​failure ([ios::failure]):

    • Если первый извлеченный символ равен delim, как определено traits_­type​::​eq, то:

      • Снимите skipws флаг.

      • s.clear()

      • Пока не будет delim достигнут неэкранированный символ или !in, извлеките символы из in и добавьте их s, за исключением того, что если escape достигнут, игнорируйте его и добавляйте следующий символ к s.

      • Отбросьте последний delim символ.

      • Восстановите skipws исходное значение флага.

    • В противном случае in >> s.

  • Если out - это экземпляр basic_­ostream с типами членов char_­type и traits_­type то же самое, что charT и и traits, соответственно, тогда выражение out << quoted(s, delim, escape) ведет себя так, как указано для const basic_­string<charT, traits, Allocator>& перегрузки quoted функции.

Выражение in >> quoted(s, delim, escape) должно иметь тип basic_­istream<charT, traits>& и значение in. Выражение out << quoted(s, delim, escape) должно иметь тип basic_­ostream​<charT, traits>& и значение out.