web-dev-qa-db-ja.com

stdinのファイルの終わり

これに関する質問がここで行われました Cのファイルの終わり(EOF) しかし、それでも私の問題は完全には解決しません。

EOFは、stdinではないデータストリームでは意味があります。たとえば、_data.txt_ファイルがある場合、fgetc()はすべての文字を読み取り、ファイルの最後に移動して_-1_を返します。

私が理解していないのは、EOFstdinの概念です。 getchar()を使用すると、何かが入力されるのを待ちます。そのため、何も書き込まれていない場合、ファイルの終わり(EOF)は自動的に返されませんか?

つまり、ユーザーのみがEOFstdinで呼び出すことにより、 Ctrl+Z?もしそうなら、EOFでのstdinの用途は何ですか?ユーザーがファイルの終わりを呼び出すまでプログラムに読み取りを続けるように指示していると思いますか?これでしょうか?

ありがとうございました

14
Mcs

何も書かれていない場合、ファイルの終わり(EOF)は自動的に返されませんか?

いいえ、ユーザーが送信する必要はありません。

つまり、ユーザーのみがEOFstdinで呼び出すことにより、 Ctrl+Z

はい、コンソールに入力できる特別なキーの組み合わせでEOFstdinインジケーターを設定できます。 Ctrl+D そしてwindowsの場合は Ctrl+Z

もしそうなら、EOFでのstdinの用途は何ですか?ユーザーのユーザーがファイルの終わりを呼び出すまでプログラムが読み取りを続けるように指示していると思いますか?これでしょうか?

これを使用するかどうかは、ユーザーにEOFを明示的に入力するように指示するかどうかによって異なります。たとえば、pythonコンソールではPress Ctrl+D or type quit() to exitのように表示されます。

また、EOFは必ずしも_-1_である必要はありません。これはマクロであり、常にEOFインジケーターのテストに使用する必要があります。さらに重要なことに、EOFは文字ではなく、[〜#〜] e [〜#〜] nd [〜#〜]であることを示す特別な値ですo [〜#〜] f [〜#〜] f [〜#〜] ileインジケーターが設定されます。

また、getchar()fgetc(stdin)と同等です。

16
Iharob Al Asimi

Linux bashでは、 CTRL+DEOFを生成します。

Windowsでは、同等のものは CTRL+Z

したがって、いいえ、もし端末に何も書き込まれていない場合、EOFは自動的に生成されません。 scanning関数はそのとき待機状態になります。したがって、他の入力がなく、待機状態の場合、 CTRL+D が押された場合、キープレスはtranslated[ターミナルドライバによって] EOFに変換されます。注意

通常、何らかの値を入力して、 ENTER キー、scannning関数がスキャンを開始します。 EOFを生成するための入力をfeedするには、次を押す必要があります CTRL+D

関連:EOFの-​​ wikiエントリ にアクセスしてください

注:明確化についてDrew氏に感謝します。

5
Sourav Ghosh

stdinはストリームであり、ユーザーがいくつかのキーを押すまでデータは利用できません。ディスク上のファイルには既に(一定量の)コンテンツが含まれています。

stdinから読み取るときに、getchar()がユーザーの入力を待機しない場合、プログラムは常にEOFを取得します。これにより、stdinを入力ファイルとして使用できなくなります。

getchar()は、ユーザーが何かを入力するのを待つので、入力が完了したことを知らせる方法はありません。そのため、オペレーティングシステムでは、コンソールで押したときにこの特別な意味を持つキーの組み合わせが提供されます。

Windowsの用途 CtrlZ およびUnixライクなOS(OSXを含む)の使用 CtrlD この目的のために。

2
axiac

ファイルstdinは、必ずしもユーザーがキーボードで入力するとは限りません。入力をプログラムにリダイレクトする場合、それは通常のファイルである可能性があります。

program.exe <input-from-file.txt

あなたを混乱させるかもしれないことは、コンソールウィンドウに入力を与えないことが入力の終わりをマークしないことです。しかし、逆に考えてみてください。コンソールがユーザーのバッファリングを行わない場合、プログラムがプログラムの前に終了しないほど、ユーザーがどのように迅速に応答できるでしょうか。押した後 Enter ユーザーは、これは入力行であると言います。つまり、コンソールウィンドウで実行されているプログラムは、常に次の入力が来るのを待ちます。

ほとんどのプログラムは、コンソールセッションを終了するための特別なフレーズを定義しています。あなたはおそらくexitを知っています。

0
Wolf