2016-05-31 3 views
0

次のコードは、stdinから文字を読み込み、EOF(ctrl-z) 。C++は文字を取得するためにcin.getを使用しますが、EOFに遭遇したときにwhileループを終了しません

#include<iostream> 
#include<fstream> 
#include<stdio.h> 
#include<string> 
using namespace std; 

int main() 
{ 
    string article ;  
    char nextChar; 
    while(cin.get(nextChar)) { 
     if(cin.eof()) break ; 
     article.append(1, nextChar) ; 
    } 

    cout << article ; 

    system("pause") ; 
} 

私はこのような入力テスト:

I am a student.<ctrl-z> 

をそして私は、Enterキーを押しますが、それは停止しません。

別の[ctrl-z]と入力してからneterを押すと、

whileループから終了できます。

最初の[ctrl-z]がeof条件を通知しないのはなぜですか?

+0

'EOF'の' Ctrl-D'を試してください。 ( 'Ctrl-Z'はしばしば「プロセスを一時停止する」)。 – Galik

+0

@Galik:それは環境特有のものです。 ASCII 26はEOFマーカーですが、Windows以外のOSの端末ではCtrl + Zを押しても通常ASCII 26は生成されません。 –

答えて

1

以下の説明は少し簡略化されています。

これはオペレーティングシステムの機能です。これがあなたのオペレーティングシステムの仕組みです。

ファイルの終わりは、実際には0を返す基本的なread()システムコールです。ファイルの終わりはCTRL-Zではありません。 CTRL-Zは、お使いのオペレーティングシステムによってインタラクティブキーバッファをフラッシュし、その内容がread()であると解釈されます。

端末に入力すると、Enterが押されるまで、プロセスは実際には何も読み取られません。その時点で、read()システムコールは完了し、読み込まれたすべてのものを返します。一般に、Enterを押す前に、入力した内容をバックスペースで編集することができます。プログラムには、編集済みの表示がありません。read()は、Enterを押した後の最終行の内容です。

あなたが何かを入力して、CTRL-Zを押すと、それがで入力されたかのように、型指定された入力は、プログラムによってもread()である。

何が入力されていない、とCTRL-Zが押され、基礎となるread()をしている場合のみ最初に何も入力されていないので、システムコールは0を返します。これはファイルの終わりの表示として解釈されます。何かが最初に入力されてしまった場合でも、CTRL-Zはではread()は0

のを引き起こすことが、その後、CTRL-Z二回目の入力に入力されたread()に1回、2回入力すると、入力バッファをクリアする必要がありますあなたのコードには無害なバグがあります。 cin.get()が成功した場合、cin.eof()は真になることはありません。

関連する問題