std::quoted
From cppreference.com
| ヘッダ <iomanip>で定義 |
||
| template< class CharT > /*unspecified*/ quoted( const CharT* s, |
(1) | (C++14以降) |
| template< class CharT, class Traits, class Allocator > /*unspecified*/ quoted( const std::basic_string<CharT, Traits, Allocator>& s, |
(2) | (C++14以降) |
| template< class CharT, class Traits> /*unspecified*/ quoted( std::basic_string_view<CharT, Traits> s, |
(3) | (C++17以降) |
| template< class CharT, class Traits, class Allocator > /*unspecified*/ quoted( std::basic_string<CharT, Traits, Allocator>& s, |
(4) | (C++14以降) |
CSVやXMLのような引用符付き文字列の挿入と抽出を可能にします。
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.fill() の out.width()-seq.size() 個のコピーが、シーケンスの末尾 ( out.flags() で ios_base::left が設定されている場合) またはシーケンスの先頭 (その他すべての場合) に追加されます。
- 最後に、結果のシーケンスの各文字が、out.rdbuf()->sputn(seq, n) を呼び出すかのように出力されます。ここで n=std::max(out.width(), seq.size()) であり、もしあれば std::setw の効果を無効にするために out.width(0) が呼び出されます。
4) 式 in >> quoted(s, delim, escape) で使用される場合、ここで
in は char_type が CharT に等しく、traits_type が Traits に等しい入力ストリームであり、以下のルールに従って std::basic_istream::operator>> を使用して in から文字を抽出します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 をスローします。
[編集] 備考
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__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) |
引数のフォーマット済み表現を新しい文字列に格納する (関数テンプレート) |