これに関する質問がここで行われました Cのファイルの終わり(EOF) しかし、それでも私の問題は完全には解決しません。
EOF
は、stdin
ではないデータストリームでは意味があります。たとえば、_data.txt
_ファイルがある場合、fgetc()
はすべての文字を読み取り、ファイルの最後に移動して_-1
_を返します。
私が理解していないのは、EOF
のstdin
の概念です。 getchar()
を使用すると、何かが入力されるのを待ちます。そのため、何も書き込まれていない場合、ファイルの終わり(EOF
)は自動的に返されませんか?
つまり、ユーザーのみがEOF
をstdin
で呼び出すことにより、 Ctrl+Z?もしそうなら、EOF
でのstdin
の用途は何ですか?ユーザーがファイルの終わりを呼び出すまでプログラムに読み取りを続けるように指示していると思いますか?これでしょうか?
ありがとうございました
何も書かれていない場合、ファイルの終わり(EOF)は自動的に返されませんか?
いいえ、ユーザーが送信する必要はありません。
つまり、ユーザーのみが
EOF
をstdin
で呼び出すことにより、 Ctrl+Z?
はい、コンソールに入力できる特別なキーの組み合わせでEOF
のstdin
インジケーターを設定できます。 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)
と同等です。
Linux bashでは、 CTRL+D、EOF
を生成します。
Windowsでは、同等のものは CTRL+Z
したがって、いいえ、もし端末に何も書き込まれていない場合、EOF
は自動的に生成されません。 scanning関数はそのとき待機状態になります。したがって、他の入力がなく、待機状態の場合、 CTRL+D が押された場合、キープレスはtranslated[ターミナルドライバによって] EOF
に変換されます。注意
通常、何らかの値を入力して、 ENTER キー、scannning関数がスキャンを開始します。 EOF
を生成するための入力をfeedするには、次を押す必要があります CTRL+D。
関連:EOF
の- wikiエントリ にアクセスしてください
注:明確化についてDrew氏に感謝します。
stdin
はストリームであり、ユーザーがいくつかのキーを押すまでデータは利用できません。ディスク上のファイルには既に(一定量の)コンテンツが含まれています。
stdin
から読み取るときに、getchar()
がユーザーの入力を待機しない場合、プログラムは常にEOF
を取得します。これにより、stdin
を入力ファイルとして使用できなくなります。
getchar()
は、ユーザーが何かを入力するのを待つので、入力が完了したことを知らせる方法はありません。そのため、オペレーティングシステムでは、コンソールで押したときにこの特別な意味を持つキーの組み合わせが提供されます。
Windowsの用途 CtrlZ およびUnixライクなOS(OSXを含む)の使用 CtrlD この目的のために。
ファイルstdin
は、必ずしもユーザーがキーボードで入力するとは限りません。入力をプログラムにリダイレクトする場合、それは通常のファイルである可能性があります。
program.exe <input-from-file.txt
あなたを混乱させるかもしれないことは、コンソールウィンドウに入力を与えないことが入力の終わりをマークしないことです。しかし、逆に考えてみてください。コンソールがユーザーのバッファリングを行わない場合、プログラムがプログラムの前に終了しないほど、ユーザーがどのように迅速に応答できるでしょうか。押した後 Enter ユーザーは、これは入力行であると言います。つまり、コンソールウィンドウで実行されているプログラムは、常に次の入力が来るのを待ちます。
ほとんどのプログラムは、コンソールセッションを終了するための特別なフレーズを定義しています。あなたはおそらくexit
を知っています。