K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2165] C言語の標準入力とEOFの扱いについて
返信


投稿者:f_ki
2019/03/26 20:40:41

Link:
重ねて質問させていただきます。
C言語ポインタ完全制覇 P.243-246 の、read_line()関数を、引数にstdinを渡して呼び出す部分について聞かせていただきたいです。

例えば標準入力から、
abcd[Enter]
ef[EOF]
というように入力すると、read_line()関数は、P.244 List4-6 の61-75行目の処理で、
まず"abcd\0"を返し、次にline_bufferが"ef"になったところでchがEOFとなるので61行目のwhileを抜けて69行目に進み、結果"ef\0"を返します。

この時点でまだNULLを返さないので、main()関数のwhileは次のループに入り、再びread_line()関数にstdinを渡して呼び出すこととなりますが、この時に61行目のgetc(fp)で取り出される値は何なのでしょうか。

実験してみると、どうもこの段階でEOF(だけ)を取り出していて72行目に進み、read_line()関数がNULLを返しているようなのですが、標準入力においてキーアクションのEOFの後に続けて入力を行うことが可能ならば、getc(fp)でその入力値を受け取ってしまうということはないのでしょうか。

それとも標準入力において一度EOFが入力されたら、以降標準入力から取り出される値はEOFとなることが決まっているのでしょうか。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2168] Re:C言語の標準入力とEOFの扱いについて
返信


投稿者:(ぱ)こと管理人
2019/03/28 00:05:43

Link:
あれ、昨晩返信したつもりなのに投稿されていませんでした。

>それとも標準入力において一度EOFが入力されたら、以降標準入力から取り出される値は
>EOFとなることが決まっているのでしょうか。

こちらです。

規格では(マクロであることを除き)getc()はfgetc()と等価とされていますが、
そのfgetc()の説明には以下のようにあります。

| 返却値 そのストリームのファイル終了表示子がセットされている場合,
| 又はストリームがファイルの終わりに達している場合,そのストリームの
| ファイル終了表示子をセットし,fgetc 関数は,EOF を返す。

つまり、FILE構造体には「ファイル終了表示子」というフラグがあり、
ファイルの最後に達するとそれがセットされて、以後はEOFを返します。


[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2170] Re:C言語の標準入力とEOFの扱いについて
返信


投稿者:f_ki
2019/03/28 14:24:48

Link:
stdinも含めてFILE構造体には、ファイルが終端に達したことを示すフラグがあって、そのフラグが立っている場合にはfgetc()で取り出される値はEOFになるということですね。
納得できました。ありがとうございます。
[ この投稿を含むスレッドを表示] [ この投稿を削除]