名前空間
変種
操作

std::quoted

提供: cppreference.com
< cpp‎ | io‎ | manip
 
 
入出力ライブラリ
入出力マニピュレータ
Cスタイルの入出力
バッファ
(C++98で非推奨)
ストリーム
抽象
ファイル入出力
文字列入出力
配列入出力
(C++98で非推奨)
(C++98で非推奨)
(C++98で非推奨)
同期化出力
エラーカテゴリインタフェース
(C++11)
 
入出力マニピュレータ
浮動小数点フォーマット
整数フォーマット
ブーリアンフォーマット
フィールド幅とフィル制御
その他のフォーマット
ホワイトスペース処理
出力のフラッシュ
ステータスフラグ操作
時間と通貨の入出力
(C++11)
(C++11)
(C++11)
(C++11)
引用符マニピュレータ
quoted
(C++14)
 
ヘッダ <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) (ただし outCharT と等しい char_type および Traits と等しい traits_type (オーバーロード (2-4) の場合) を持つ出力ストリームです) で使用されたとき、以下のように構築される文字のシーケンス seqout に挿入する FormattedOutputFunction として動作します。
a) まず、文字 delim がシーケンスに追加されます。
b) その後、 s のすべての文字。 ただし、出力する次の文字が delim または escape と等しい (ストリームの traits_type::eq によって判定されます) 場合は、その前に escape のコピーを追加します。
c) 最後に、 delimseq にもう一度追加されます。
その後、 seq.size() < out.width() の場合は、シーケンスの終端 (out.flags()) に ios_base::left がセットされている場合) またはシーケンスの先頭 (それ以外のすべての場合) のいずれかにフィル文字 out.fill() のコピーを out.width()-seq.size() 個追加します。
最後に、 out.rdbuf()->sputn(seq, n) (ただし n=std::max(out.width(), seq.size()) です) を呼んだかのように、結果のシーケンスの各文字を出力し、 std::setw の効果 (もしあれば) を取り消すために out.width(0) を呼びます。
4) (2) と同じですが、さらに式 in >> quoted(s, delim, escape) (ただし inCharT と等しい char_type および Traits と等しい traits_type を持つ入力ストリームです) で使用されたとき、以下のルールに従って 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 を投げます。

[編集]

#include <iostream>
#include <iomanip>
#include <sstream>
 
int main()
{
    std::stringstream ss;
    std::string in = "String with spaces, and embedded \"quotes\" too";
    std::string out;
 
    ss << std::quoted(in);
    std::cout << "read in     [" << in << "]\n"
              << "stored as   [" << ss.str() << "]\n";
 
    ss >> std::quoted(out);
    std::cout << "written out [" << out << "]\n";
}

出力:

read in     [String with spaces, and embedded "quotes" too]
stored as   ["String with spaces, and embedded \"quotes\" too"]
written out [String with spaces, and embedded "quotes" too]

[編集] 関連項目