命名空间
变体
操作

std::quoted

来自 cppreference.com
< cpp‎ | io‎ | manip
 
 
 
输入/输出操作符
浮点格式化
整数格式化
布尔格式化
字段宽度和填充控制
其他格式化
空白处理
输出刷新
(C++20)  

状态标志操作
时间和货币 I/O
(C++11)
(C++11)
(C++11)
(C++11)
带引号的操作符
quoted
(C++14)
 
定义在头文件 <iomanip>
template< class CharT >

/*未指定*/ quoted( const CharT* s,

                        CharT delim = CharT('"'), CharT escape = CharT('\\') );
(1) (自 C++14 起)
template< class CharT, class Traits, class Allocator >

/*未指定*/ quoted( const std::basic_string<CharT, Traits, Allocator>& s,

                        CharT delim = CharT('"'), CharT escape = CharT('\\') );
(2) (自 C++14 起)
template< class CharT, class Traits>

/*未指定*/ quoted( std::basic_string_view<CharT, Traits> s,

                        CharT delim = CharT('"'), CharT escape = CharT('\\') );
(3) (自 C++17 起)
template< class CharT, class Traits, class Allocator >

/*未指定*/ quoted( std::basic_string<CharT, Traits, Allocator>& s,

                        CharT delim=CharT('"'), CharT escape=CharT('\\') );
(4) (自 C++14 起)

允许插入和提取带引号的字符串,例如在 CSVXML 中找到的字符串。

1-3) 当在表达式 out << quoted(s, delim, escape) 中使用时,其中 out 是一个输出流,其 char_type 等于 CharT,并且对于重载 (2,3),traits_type 等于 Traits,其行为类似于 FormattedOutputFunction,它将以下构造的字符序列 seq 插入到 out 中:
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 - 用作转义字符的字符,默认值为 \

[编辑] 返回值

返回一个未指定类型的对象,以便执行所描述的行为。

[编辑] 异常

如果 operator>>operator<< 抛出异常,则抛出 std::ios_base::failure

[编辑] 备注

特性测试 Std 特性
__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)
将参数的格式化表示存储在一个新的字符串中
(函数模板) [编辑]