0

これらの2つの関数istream::get(char *、streamsize)とistream :: get(char *、streamsize、char)が、cinバッファーの最初の文字として「\ n」を見つけたときにcin.failビットを設定するのはなぜですか?

ここに見られるように、それは上記の2つのオーバーロードの動作です。これらの関数をこのように設計する目的は何でしたか?どちらの関数もバッファに文字'\n'を残しますが、いずれかを2回呼び出すと、リンクに示されているように、改行文字が原因で失敗することに注意してください。関数istream::get()およびistream :: getline()のオーバーロードのように、これら2つの関数をバッファーに文字'\ n'を残さないようにする方が理にかなっていますか?

4

1 に答える 1

1

ではstd::istream::getline、区切り文字が見つかった場合、それが抽出されて破棄されます。std::istream::get区切り文字はストリームに残ります。

区切り文字が読み取られて破棄されたのか、それとも文字だけが読み取られgetlineたのかはわかりませんn - 1。行全体のみを読みたい場合は、次の文字に and を使用getして、それpeekが改行か指定された区切り文字かを確認できます。

しかし、区切り文字までの行全体を読みたい場合は、 を使用することもできますstd::getline。これは、どのような場合でも行全体を読み取ります。

于 2013-01-14T17:59:36.137 に答える