operator<<,>>(std::basic_string)
From cppreference.com
< cpp | string | basic string
| ヘッダ <string> で定義 |
||
| template< class CharT, class Traits, class Allocator > std::basic_ostream<CharT, Traits>& |
(1) | |
| template< class CharT, class Traits, class Allocator > std::basic_istream<CharT, Traits>& |
(2) | |
1) FormattedOutputFunctionとして動作します。sentryオブジェクトを構築・チェックした後、出力フォーマットのパディングを決定します。
次に、結果のシーケンス seq(strの内容とパディング)の各文字を、os.rdbuf()->sputn(seq, n) を呼び出すかのように、出力ストリーム os に挿入します。ここで n は std::max(os.width(), str.size()) です。最後に、os.width(0) を呼び出して、std::setw の効果(もしあれば)をキャンセルします。
|
return os << std::basic_string_view<CharT, Traits>(str);と同等です。 |
(C++17以降) |
2) FormattedInputFunctionとして動作します。sentryオブジェクトを構築・チェックした後、先行する空白をスキップすることがあります。まず str.erase() で str をクリアし、次に is から文字を読み込み、 str.append(1, c) を呼び出すかのように str に追加していきます。以下のいずれかの条件が満たされるまで続行します。
- 読み取られた文字数が is.width() (ただし is.width() > 0 の場合) または str.max_size() になります。
- ストリーム is でファイルの終端条件が発生する。
- std::isspace(c, is.getloc()) が、is の次の文字 c に対して true になる。
抽出された文字がない場合、is の std::ios::failbit が設定され、std::ios_base::failure がスローされる可能性があります。
最後に、is.width(0) を呼び出して、std::setw の効果(もしあれば)をキャンセルします。目次 |
[編集] 例外
1) 出力中に例外がスローされた場合、std::ios_base::failure がスローされることがあります。
2) is から文字が抽出されなかった場合(例:ストリームがファイルの終端にあるか、空白文字のみで構成されている場合)、または入力中に例外がスローされた場合、std::ios_base::failure がスローされることがあります。
[編集] パラメータ
| os | - | 文字出力ストリーム |
| is | - | 文字入力ストリーム |
| str | - | 挿入または抽出する文字列 |
[編集] 戻り値
1) `os`
2) `is`
[編集] 例
このコードを実行
#include <iostream> #include <sstream> #include <string> int main() { std::string greeting = "Hello, whirled!"; std::istringstream iss(greeting); std::string hello_comma, whirled, word; iss >> hello_comma; iss >> whirled; std::cout << greeting << '\n' << hello_comma << '\n' << whirled << '\n'; // Reset the stream iss.clear(); iss.seekg(0); while (iss >> word) std::cout << '+' << word << '\n'; }
出力
Hello, whirled! Hello, whirled! +Hello, +whirled!
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 25 | C++98 | n は os.width() と str.size() の小さい方でした。 | n はそれらの大きい方です。 |
| LWG 90 | C++98 | std::isspace(c, getloc()) を使用してチェックしていました。 空白文字についてですが、<string> には getloc が宣言されていませんでした。 |
getloc() を置き換えました。 に is.getloc() |
| LWG 91 | C++98 | operator>> は動作しませんでした。として FormattedInputFunction |
として動作します。 FormattedInputFunction |
| LWG 211 | C++98 | operator>> は、文字が抽出されなかった場合に failbit を設定しませんでした。 |
failbit を設定します。 |
| LWG 435 | C++98 | os.rdbuf()->sputn(str.data(), n) によって文字が挿入されていました。 そして、LWG issue 25 の解決により、挙動が os.width() が str.size() より大きい場合に未定義となりました。 |
パディングを決定します。 まず、パディングされた 文字シーケンスを挿入します。 |
| LWG 586 | C++98 | operator<< は動作しませんでした。として FormattedOutputFunction |
として動作します。 FormattedOutputFunction |
[編集] 関連項目
| (C++17) |
string viewのストリーム出力を行う (function template) |