teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

記述の追加

2019/09/06 05:31

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -26,4 +26,15 @@
26
26
  if (feof(fp)) break;
27
27
  printf("=> %s", buf);
28
28
  }
29
- ```
29
+ ```
30
+ **追記**
31
+ 上の 2つのプログラムは等価ではありません。
32
+
33
+ 入力データが 3行で3行目の最後に '\n' が
34
+ ない場合、例えば、"abc\n" "def\n" "ghi" だったとします。
35
+ fgets が最後の "ghi" を読み込んだとき、
36
+ fgets は、NULL ではなく、buf を返します。
37
+ feof(fp) は 真(0以外の値) になります。
38
+
39
+ 最初のプログラムでは、"ghi" を表示します。
40
+ 2つ目のプログラムでは、"ghi" を表示しません。

1

記述の間違いを訂正

2019/09/06 05:31

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -5,9 +5,9 @@
5
5
  最後に同じ行が 2行ありますよね。
6
6
 
7
7
  feof(fp) は直前に実行した入力関数がファイルの最後を検出し
8
- 入力処理が失敗したときに 0 になります。
8
+ 入力処理が失敗したときに 0 以外の値になります。
9
9
  その実行例では fp から 13行のデータを読み込んでいるのですが、
10
- 13行目の読み込みは成功するので、feof(fp) は 0 ではありません
10
+ 13行目の読み込みは成功するので、feof(fp) は 0 で
11
11
  そして、14行目を fgets で読みに行きます。
12
12
  そこで、ファイルの最後を検出し、読み込みに失敗します。
13
13
  fgets の失敗をチェックしていないので、buf に残っている