
No.4ベストアンサー
- 回答日時:
★回答者 No.1 です。
追記。・回答者 No.2、No.3 さんの通り『EOF』は『EOFコード(^Z)』をバッファに
残すわけではありませんよ。→イメージ的には『あっている』のですよ。あくまで。
・厳密には、回答者 No.3 さんのアドバイスどおりです。
・つまり、『fgets』関数で1文字も読み取れなかった場合には、『ファイル終了』
というフラグ情報をセットするのです。→EOFをバッファに残す感じですね。
・そのため、次に読み込んだ場合に、このフラグ情報を『EOF』として読み取って
終了するわけです。→『fgetc』関数も同じ仕組みです。
・また、途中でエラーが発生した場合にも『fgets』関数は『NULL』を返します。
・この場合は、『エラー発生』のフラグ情報をセットしてから『NULL』を返すのです。
・よって『NULL』が返される多くの場合は、『ファイル終了』ですが、エラーが発生
しても『NULL』が返されます。そこで、『feof』関数や、『ferror』関数でどちらか
判定するわけです。feof(fp) や ferror(fp) で 0 以外が返されたら『ファイル終了』
や『エラー発生』と判別します。→厳密にエラー発生の対策をする場合はね。
・あと、一度『エラー発生』のフラグがセットされると『fseek』関数などではその
情報はクリアされません。→『clearerr』関数でクリアします。
・『ファイル終了』情報はファイル・ポインタの位置を変える『fseek』関数などで
その情報がクリアされます。
・『ファイル終了』、『エラー発生』のフラグ情報などは、それぞれのファイル
ポインタで管理されています。
最後に:
・イメージ的には、最後に『EOFを読み取り終了』という事になります。
・質問者さんは、プログラムや、テストプログラムを作って動作に疑問を持ったのですね。
そうでないと、『EOF』を検出して、1文字も読み取れなかった場合、配列内容が変化
しない事を推測できませんものね。
・そこで、最後にアドバイスします。
・疑問があったら簡単なテスト・プログラムを作ってみて確認することがとても大事ですよ。
動作確認すると『fgets』関数などの仕組みをより理解できますから。
・以上。おわり。
No.3
- 回答日時:
> 配列に1文字以上読み取れた場合、EOFをバッファに残し配列に'\0' を追加する。
EOFをバッファに残すのではなく、「ファイル終了表示子」をセットすることになります。
ちなみに、fgets関数がNULLを返すのは、EOFに達した場合だけではありません。読み込み途中にエラーが発生した場合にもNULLを返しますが、その場合は「エラー表示子」をセットし、配列の内容は不定になります。
No.2
- 回答日時:
EOFはキャラクタではないので、EOFがバッファに格納されることはないと思います。
DOS/Windows形式だと^Z がEOFを表すキャラクタとしてファイル中に存在する場合がありえますが、
その場合でも^Z自身がバッファに格納されることはなかったと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
nullと"、\\0とEOFの違いについて。
C言語・C++・C#
-
C言語初心者の質問失礼します。
C言語・C++・C#
-
-
4
fgets関数を使用したときの文字あふれについて
C言語・C++・C#
-
5
fgetsで拾われる改行文字を削除したい
C言語・C++・C#
-
6
GetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・
C言語・C++・C#
-
7
関数から配列を返すには?
C言語・C++・C#
-
8
ファイルから読み取った改行文字を消す方法
C言語・C++・C#
-
9
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
10
改行を読み飛ばす
C言語・C++・C#
-
11
テキストファイルから文字列を読み込んで二次元配列に格納するには
C言語・C++・C#
-
12
C言語 配列の長さの上限
C言語・C++・C#
-
13
テキストファイルの行数を取得する方法(C言語
C言語・C++・C#
-
14
INIファイルからのデータ読込みについて
C言語・C++・C#
-
15
c言語のポインタへの文字列入力についてです。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【COBOL】read文でエラー
-
access テキストボックスの値取得
-
PowerShellを使って関連付けら...
-
「パス名が無効です」の発生原因
-
エクセルで質問です。 ハイパー...
-
エクセル VBA dll 読み込...
-
FTPの送信結果を検知したい
-
Returnに対するGoSubがありません
-
データベースソフトのアクセス2...
-
NAS上のファイルの使用中が解除...
-
アクセスのクエリでコンパイル...
-
OUTLOOK VBA 指定フォルダ内の...
-
エクセルマクロでエラーの原因...
-
VB.NETでNTFSのストリームの読...
-
VB スクリプトで
-
Excelファイルのマクロによる排...
-
Adobeのプレミアプロの書き出し...
-
PHP 設定ファイルの読み込みエ...
-
batファイルでレジストリキーの...
-
Access2010 コンパイルエラー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2003 のエラーメッセージ
-
access テキストボックスの値取得
-
「パス名が無効です」の発生原因
-
エクセルで質問です。 ハイパー...
-
【関数】同じ関数なのに、エラ...
-
VB6 Dir関数で52エラー発生
-
batファイルでレジストリキーの...
-
Returnに対するGoSubがありません
-
ExcelVBAで既に開いてるwordを...
-
NAS上のファイルの使用中が解除...
-
アクセスのクエリでコンパイル...
-
【COBOL】read文でエラー
-
PowerShellを使って関連付けら...
-
エクセルマクロでエラーの原因...
-
fgets関数のEOFの扱い方について
-
VBでファイルが開かれているか...
-
FORTRANの実行エラーについて
-
VBから参照できないCのDLLを使...
-
gccを行ってもexeファイルが生...
-
fcloseで発生するエラーについて。
おすすめ情報