std::basic_istream<CharT,Traits>::get
From cppreference.com
< cpp | io | basic istream
| int_type get(); |
(1) | |
| basic_istream& get( char_type& ch ); |
(2) | |
| basic_istream& get( char_type* s, std::streamsize count ); |
(3) | |
| basic_istream& get( char_type* s, std::streamsize count, char_type delim ); |
(4) | |
| basic_istream& get( basic_streambuf& strbuf ); |
(5) | |
| basic_istream& get( basic_streambuf& strbuf, char_type delim ); |
(6) | |
ストリームから文字または文字列を抽出します。
すべてのオーバーロードは、UnformattedInputFunction として動作します。セントリーオブジェクトを構築し、チェックした後、これらの関数は以下を実行します。
2) 利用可能な文字を1つ読み込み、ch に格納します。利用できない場合は、ch は変更されず、failbit および eofbit が設定されます。フォーマットされた文字入力演算子>>とは異なり、この関数は signed char および unsigned char の型ではオーバーロードされていないことに注意してください。
3) get(s, count, widen('\n')) と同じです。つまり、最大 std::max(0, count - 1) 文字を読み込み、'\n' が見つかるまで、s が指す文字配列に格納します。
4) 文字を読み込み、s が指す文字配列の successive locations に格納します。以下のいずれかの条件が発生するまで、文字が抽出され格納されます。
- count が 1 未満であるか、または count - 1 文字が格納された。
- 入力シーケンスでファイルの終端条件が発生した(setstate(eofbit) が呼び出される)。
- 次に利用可能な入力文字 c が delim と等しい(Traits::eq(c, delim) によって判定される)。この文字は抽出されません(
getline()とは異なり)。
いずれの場合も、if ( count > 0 )、配列の次の successive location にヌル文字(CharT())が格納されます。
5) get(strbuf, widen('\n')) と同じです。つまり、利用可能な文字を読み込み、指定された basic_streambuf オブジェクトに挿入します。`'\n'` が見つかるまで挿入されます。
6) 文字を読み込み、指定された basic_streambuf オブジェクトによって制御される出力シーケンスに挿入します。以下のいずれかの条件が発生するまで、文字が抽出され strbuf に挿入されます。
- 入力シーケンスでファイルの終端条件が発生した。
- 出力シーケンスへの挿入が失敗した(この場合、挿入できなかった文字は抽出されません)。
- 次に利用可能な入力文字 c が delim と等しい(Traits::eq(c, delim) によって判定される)。この文字は抽出されません。
- 例外が発生した(この場合、例外はキャッチされ、再スローされません)。
文字が抽出されなかった場合、setstate(failbit) を呼び出します。
すべてのオーバーロードで、gcount() の値は抽出された文字数に設定されます。
目次 |
[編集] パラメータ
| 文字 | - | 結果を書き込む文字への参照 |
| s | - | 文字を格納する文字文字列へのポインタ |
| count | - | s が指す文字文字列のサイズ |
| delim | - | 抽出を停止する区切り文字。抽出も格納もされません。 |
| strbuf | - | 読み込み先のストリームバッファ |
[編集] 戻り値
1) 抽出された文字、または Traits::eof()。
2-6) *this
[編集] 例外
failure: エラーが発生した場合(エラー状態フラグが goodbit ではない)で、exceptions() がその状態に対してスローするように設定されている場合。内部操作が例外をスローした場合、それはキャッチされ、badbit が設定されます。exceptions() が badbit に対して設定されている場合、例外は再スローされます。
[編集] 例
このコードを実行
#include <iostream> #include <sstream> int main() { std::istringstream s1("Hello, world."); char c1 = s1.get(); // reads 'H' std::cout << "after reading " << c1 << ", gcount() == " << s1.gcount() << '\n'; char c2; s1.get(c2); // reads 'e' char str[5]; s1.get(str, 5); // reads "llo," std::cout << "after reading " << str << ", gcount() == " << s1.gcount() << '\n'; std::cout << c1 << c2 << str; s1.get(*std::cout.rdbuf()); // reads the rest, not including '\n' std::cout << "\nAfter the last get(), gcount() == " << s1.gcount() << '\n'; }
出力
after reading H, gcount() == 1 after reading llo,, gcount() == 4 Hello, world. After the last get(), gcount() == 7
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 370 | C++98 | オーバーロード (5) の効果は get(s, count, widen('\n')) でした。 これはオーバーロード (3) の効果です。 |
に修正されました get(strbuf, widen('\n')) |
| LWG 531 | C++98 | オーバーロード (3,4) は、 count が非正の場合を処理できませんでした。 |
この場合、文字は 抽出されません。 |
[編集] 関連項目
| 文字のブロックを抽出する (public member function) | |
| 書式付きデータを抽出する (public member function) | |
| 文字と文字配列を抽出する (function template) |