3

istream_iteratorから文字を読み取るために使用しようとしていますcinCtrl+を押すと、入力ストリームを終了Dする文字が送信されることを読みました。EOF残念ながら、問題が発生しています。これが私のコードです:

#include <iterator>
int main()
{
  using namespace std;

  istream_iterator<char> it(cin), eos;
  while (it != eos) clog << *(it++);
}

私はそれを実行して:と入力し、次に+as dfを押します。最後のものなしでのみ出力し、入力を待ってハングします。入力してもう一度+を押すと、最後に残りが印刷され、次の入力からが印刷されますが、最後のはありません。そして、何も入力せずに最後に+を押すと、残りが出力されて終了します。CtrlDasdfghCtrlDfghCtrlDh

この最初のシーケンスの最後ですでに+をasdf押したので、読み取りと終了を期待していました。CtrlD

取得後も入力を待っているのはなぜEOFですか?
前に読み取った最後の文字が印刷されないのはなぜEOFですか?また、前に何も入力せずに+
を押したときにのみ終了するのはなぜですか? このループを期待どおりに動作させるには、どのように変更する必要がありますか?(つまり、前に何かを入力したかどうかに関係なく、入力で+シーケンスを取得した直後に読み取りを停止し、までのすべての文字を読み取ります)。CtrlD
CtrlDEOF

4

2 に答える 2

6

入力イテレータには特別な注意が必要です。このようにループを書き直すと、動作は他の文字入力ループと同様になります。

while (it != eos)
{
    clog << *it;
    it++;
}

これで「最後の文字が印刷されない理由」が処理されます

PS:行の真ん中のEOFに関しては、それはPOSIXで義務付けられた動作です:

受信すると、読み取られるのを待っているすべてのバイトは、改行を待たずにすぐにプロセスに渡され、EOFは破棄されます。したがって、待機中のバイトがない場合(つまり、EOFが行の先頭で発生した場合)、ファイルの終わりを示すread()からバイトカウント0が返されます。

于 2011-09-07T17:47:41.763 に答える
3

Unixライクなシステムでは、Ctrl+と入力Dすると、行の先頭でのみ(つまり、入力直後)ファイルの終わり条件がトリガーされますEnter。行の途中でファイルの終わり条件をトリガーするには、Ctrl+Dを2回入力します。

于 2011-09-07T17:53:00.480 に答える