c++ファイル終端

2117 ワード

次のプログラムがどうやって終わるのかずっと不思議で、何度も車に戻っても始まらない.
#include<iostream>

int main()

{

    int amount=0,value;

    while(std::cin>>value)

        if(value<=0)

            ++amount;

    std::cout<<"Amount of all negative values read is"

        <<amount<<std::endl;

    return 0;

}

 
Ctrl+zを2回押して戻るという人もいれば、EOFを直接入力すればOKという人もいます.やってみたら、こんなもんだった.
Ctrl+z+リターン+リターンまたはEOF+リターンまたは0+リターン
 
Windowsシステムでは一般的にブロック式検査Ctrl+Z、Unix/Linuxシステムでは非ブロック式検査Ctrl+Dが用いられる.
このようなブロック方式には、リターンを押してから、その前にCtrl+Zが押されたかどうかを検出することができるという特徴がある.もう1つの特徴は、入力バッファに読み取り可能なデータがある場合、Ctrl+Zは検出されないことです.(読みたいデータがあるので、ストリームの末尾までは考えられません).もう一つ知っておくべきことは、Ctrl+Zは普通のASCIIコード値ではなく、つまり1文字ではないので、キーボードから入力された他の文字と同じように入力バッファに格納できないことです.
キーボードから-2^zを入力して車を戻した後、Windowsシステムでは、車を返す役割で、前の-2文字は入力バッファに送られます(注意:前述したように^zは文字を生成しないので、入力バッファには格納されません.バッファには^zが存在しません).このときcin.get()は入力バッファにデータがすでに存在することを検出します(したがって^zの入力があるかどうかはチェックされず)、対応するデータをバッファから読み出します.すべての読み出しが完了すると、入力バッファは再び空になり、cin.get()は新しい入力を待機します.このように、^zが押されているにもかかわらず、その前に他の入力文字(-2)が存在するため、ストリームも終了しない.したがって、入力ストリームが終了する条件は、^zの前に文字入力(リターンを除く)ができないことであり、そうでなければ^zはストリーム終了の役割を果たさないことである.
 
EOFはEnd Of Fileの略です.C言語では、標準ライブラリで定義されたマクロです.EOFはファイルから読み込まれた文字だと勘違いされることが多い.実は、EOFは文字ではなく、intタイプの負数(例えば-1)として定義されています.EOFはファイルに実際に存在する内容でもありません.EOFは、ファイルを最後まで読んだ状態(この状態はfeof()で検出可能)だけを表すのではなく、I/O操作での読み取り、書き込みエラー(通常はferror()で検出できます)およびその他の関連操作のエラー状態.