web-dev-qa-db-ja.com

while(cin >> ss)の間に文字列ssの入力がなくなったことを示す方法

「cin」を使用して、入力ストリームから単語を読み取りました。

int main( ){
     string Word;
     while (cin >> Word){
         //do sth on the input Word
     }

    // perform some other operations
}

コード構造は上記のようなものです。コンパイル可能です。実行中、私は次のようなものを入力し続けます

aa bb cc dd

私の質問は、この入力を終了する方法ですか?つまり、テキストファイルが「aa bbccdd」であるとします。しかし、ファイルが終了したことをプログラムに知らせる方法がわかりません。

12
user630983

あなたのコードは正しいです。インタラクティブに入力する場合は、CTRL-DなどのEOF文字を送信する必要があります。

このEOFファイルを読み取る場合、文字は必要ありません。これは、入力ストリームの最後に到達すると、「cin」に何も残らないためです(ストリームが現在は閉じています)、したがって、whileループは終了します。

18
Mike Lewis

他の人がすでにこの質問に答えているので、私はこの重要な点を追加したいと思います:

WindowsのCtrl-Z(およびUNIXシステムのCtrl-D)により、EOFに到達し、whileループを終了しますが、whileループの外側では、それ以上の入力を読み取ることができません。 EOFはすでに到達しています。

したがって、cinを使用して読み取りを再度有効にするには、以下に示すように、eofフラグと他のすべての失敗フラグをクリアする必要があります。

cin.clear();

これを行った後、cinを使用して入力の読み取りをもう一度開始できます!

5
Nawaz
int main() {
     string Word;
     while (cin >> Word) {
         // do something on the input Word.
         if (foo)
           break;
     }
    // perform some other operations.
}
3
fuzz

Ctrl-Z(* nixシステムではCtrl-D)を押し、Enterキーを押します。 EOFを送信し、ストリームを無効にします。

1
jonsca

cin >> some_variable_or_manipulatorは常にcinへの参照に評価されます。まだ読むべき入力があるかどうかを確認したい場合は、次のようなことを行う必要があります。

int main( ){
     string Word;
     while (cin.good()){
         cin >> Word;
         //do sth on the input Word
     }

    // perform some other operations
}

これにより、ストリームのグッドビットがチェックされます。これは、eofbit、failbit、またはbadbitのいずれも設定されていない場合にtrueに設定されます。読み取りエラーが発生した場合、またはストリームがEOF文字を受信した場合(ファイルの終わりに到達したとき、またはユーザーがCTRL + Dを押したとき)、cin.good()はfalseを返し、ループから抜け出します。

1
Null Set

ファイルの最後から飛び出したいと思います。 basic_ios :: eof の値を取得でき、ストリームの最後でtrueを返します。

0
Nickolas

ファイルから入力を取得します。次に、プログラムが入力の取得を停止すると、whileループが終了することがわかります。実際、cinは、EOFマーカーが見つかると、入力の取得を停止します。各入力ファイルは、このEOFマーカーで終わります。このEOFマーカーがoperator>>によって検出されると、内部フラグeofbitの値がfalseに変更され、その結果、whileループが停止します。

0
Mostafiz Rahman

ENTERを押してループを終了するのに役立ちます。

int main() {
    string Word;
    while(getline(cin,Word) && s.compare("\0") != 0) {
        //do sth on the input Word
    }

    // perform some other operations
}
0
Eldar

入力内の特別な単語をチェックできます。 F.e. "やめる":

int main( ){
   string Word;

   while (cin >> Word){
      if(Word == "stop")
          break;

      //do sth on the input Word
   }

// perform some other operations
}
0
Serid