std::basic_istream<CharT,Traits>:: get
From ja.cppreference.net
<
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 s として動作します。セントリオブジェクトの構築とチェックを行った後、これらの関数は以下を実行します:
2)
利用可能な場合、1文字を読み取り
ch
に格納する。それ以外の場合、
ch
は変更せずに
failbit
と
eofbit
を設定する。この関数は、書式化文字入力演算子>>とは異なり、
signed
char
と
unsigned
char
の型でオーバーロードされていないことに注意。
3)
get
(
s, count, widen
(
'
\n
'
)
)
と同じです。つまり、最大で
std::
max
(
0
, count
-
1
)
個の文字を読み取り、
s
が指す文字列に格納します。
'
\n
'
が見つかるまで続行します。
4)
文字を読み取り、
s
が指す先頭要素から始まる文字配列の連続する位置に格納します。以下のいずれかの条件が発生するまで、文字の抽出と格納が行われます:
- count が 1 未満であるか、 count - 1 文字が格納された場合。
- 入力シーケンスでEOF状態が発生した場合( setstate ( eofbit ) が呼び出されます)。
-
次に利用可能な入力文字
c
が
delim
と等しい場合(
Traits
::
eq
(
c, delim
)
によって判定)。この文字は抽出されません(
getline()とは異なります)。
いずれの場合も、
count
>
0
の場合、配列の次の連続する位置にヌル文字(
CharT
(
)
)が格納されます。
5)
get
(
strbuf, widen
(
'
\n
'
)
)
と同じ。つまり、利用可能な文字を読み取り、
basic_streambuf
オブジェクトに挿入する。この処理は
'
\n
'
が見つかるまで継続する。
6)
文字を読み取り、指定された
basic_streambuf
オブジェクトによって制御される出力シーケンスに挿入します。文字は抽出され、
strbuf
に挿入されますが、以下のいずれかの条件が発生すると停止します:
- 入力シーケンスでEOF(ファイル終端)状態が発生した場合。
- 出力シーケンスへの挿入が失敗した場合(この場合、挿入できなかった文字は抽出されません)。
- 次に利用可能な入力文字 c が delim と等しい場合( Traits :: eq ( c, delim ) によって判定)。この文字は抽出されません。
- 例外が発生した場合(この場合、例外はキャッチされ再スローされません)。
文字が抽出されなかった場合、 setstate ( failbit ) を呼び出します。
すべてのバージョンは、 gcount() の値を抽出された文字数に設定します。
目次 |
パラメータ
| ch | - | 結果を書き込む文字への参照 |
| s | - | 格納する文字列へのポインタ |
| count | - | s が指す文字列のサイズ |
| delim | - | 抽出を停止する区切り文字。抽出されず、格納もされない |
| strbuf | - | コンテンツを読み取るストリームバッファ |
戻り値
1)
抽出された文字または
Traits
::
eof
(
)
。
2-6)
*
this
例外
内部操作が例外をスローした場合、それは捕捉され、
badbit
が設定されます。
exceptions()
が
badbit
に対して設定されている場合、例外は再スローされます。
例
このコードを実行
#include <iostream> #include <sstream> int main() { std::istringstream s1("Hello, world."); char c1 = s1.get(); // 'H'を読み取り std::cout << "after reading " << c1 << ", gcount() == " << s1.gcount() << '\n'; char c2; s1.get(c2); // 'e'を読み取り char str[5]; s1.get(str, 5); // "llo,"を読み取り std::cout << "after reading " << str << ", gcount() == " << s1.gcount() << '\n'; std::cout << c1 << c2 << str; s1.get(*std::cout.rdbuf()); // 残りを読み取り('\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 が非正の場合を 扱えなかった |
この場合、文字は
抽出されない |
関連項目
|
文字ブロックを抽出する
(公開メンバ関数) |
|
|
書式付きデータを抽出する
(公開メンバ関数) |
|
|
文字と文字配列を抽出する
(関数テンプレート) |