名前空間
変種
操作

operator<<,>>(std::basic_string)

From cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
 
ヘッダ <string> で定義
template< class CharT, class Traits, class Allocator >

std::basic_ostream<CharT, Traits>&
    operator<<( std::basic_ostream<CharT, Traits>& os,

                const std::basic_string<CharT, Traits, Allocator>& str );
(1)
template< class CharT, class Traits, class Allocator >

std::basic_istream<CharT, Traits>&
    operator>>( std::basic_istream<CharT, Traits>& is,

                std::basic_string<CharT, Traits, Allocator>& str );
(2)
1) FormattedOutputFunctionとして動作します。sentryオブジェクトを構築・チェックした後、出力フォーマットのパディングを決定します

次に、結果のシーケンス seqstrの内容とパディング)の各文字を、os.rdbuf()->sputn(seq, n) を呼び出すかのように、出力ストリーム os に挿入します。ここで nstd::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 になる。

抽出された文字がない場合、isstd::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 nos.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

[編集] 関連項目

string viewのストリーム出力を行う
(function template) [編集]
English 日本語 中文(简体) 中文(繁體)