この例はK&Rの本からのものです
#include<stdio.h>
main()
{
long nc;
nc = 0;
while(getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
なぜそのように機能するのか説明していただけますか。ありがとう。
^ Z ^ Zも機能しません(行の先頭にない限り)
tty文字の従来のUNIXの解釈は、クックされたttyラインバッファ内にバッファリングされているものをすべて読み取った後EOF
、ブロッキングを返すことです。read
新しい行の先頭では、read
0を返す(ゼロバイトを読み取る)ことを意味します。ちなみに、0サイズread
は、通常のファイルのファイルの終わりの状態を検出する方法です。
そのため、行の途中の最初 の行は、Cランタイムライブラリにファイルの終わりを検出させずEOF
に、行の先頭を強制します。2番目の文字は空のバッファをアプリケーションによって強制的に実行するため、2つの文字が連続して0サイズの読み取りを生成します。read
EOF
read
$ cat
foo[press ^D]foo <=== after ^D, input printed back before EOL, despite cooked mode. No EOF detected
foo[press ^D]foo[press ^D] <=== after first ^D, input printed back, and on second ^D, cat detects EOF
$ cat
Some first line<CR> <=== input
Some first line <=== the line is read and printed
[press ^D] <=== at line start, ^D forces 0-sized read to happen, cat detects EOF
Cランタイムライブラリは上記のセマンティクスを模倣していると思います(Windowsでは、システムコールはもちろん、コール^Z
レベルでの特別な処理はありません)。そのため、入力行の途中でもkernel32
EOFを検出する可能性があります。^Z^Z
たまたまあなたと同じ質問がありました。関数を終了したい場合はgetchar()
、2を入力するEOF
か、<ENTER>
プラスaを入力する必要がありEOF
ます。
そして、これが私がこの質問について検索したより簡単な答えです:
ターミナルに登場するキャラクターがいる場合、EOFはこの入場を阻止する役割を果たし、新たな入場ターンを引き起こします。一方、入力が発生していない場合、つまりgetchar()が新しい入力を待機している場合(入力が終了したばかりやEOFなど)、入力しようとしているEOFは「end」になります。 of file」。これにより、プログラムは関数getchar()の実行を停止します。
PS:質問はあなたが使用しているときに起こりますgetchar()
。この答えは理解しやすいと思いますが、中国語から翻訳されているので、おそらくあなたには向いていません...
プログラムはEOF
、入力の実際の最後でのみ読み取ります。端末/OS/ファイルが行の先頭でのみ終了することを許可している場合は、そこにファイルがあります。これは、データが一度に1回線しか送信されなかった昔ながらの端末への逆戻りだと思います(私が知っている限りでは、パンチカードリーダーに戻ります)。
EOF正中線で事前に準備したファイルからデータを読み取ってみてください。一部の編集者がこれを困難にしていることに気付くかもしれません!プログラムはそれを入力として正常に動作するはずです。
EOFは「ファイルの終わり」を示します。改行(Enterキーを押すと発生します)はファイルの終わりではなく、行の終わりであるため、改行はこのループを終了しません。
オペレーティングシステムによっては、EOF
文字は行の最初の文字、つまり。の後の最初の文字である場合にのみ機能しEnter
ます。コンソール入力は多くの場合行指向であるため、システムは、EOF
フォローアップするまで文字を認識しない場合がありますEnter
。