質問: NULL){ printf("読み込みデータなし\n"); }else{ printf("%s", buff); // printf()関数で読み込んだ内容を表示します。 // fgets()関数でbuffに読み込まれるのはfileの改行も // 読み込むので\nとしなくても、改行される。 } } printf("fseek:%d\n", fseek(fp, 0, SEEK_SET)); // SEEK_SET:ファイルの先頭から // fseek()関数で読み込み位置をファイルの先頭から // 0バイト目に戻します。 fclose(fp); } 実行結果は以下になります。 naka@naka ~/kadai/kadai9-8 $ gcc -o delete_seek5 delete_seek5.c -Wall naka@naka ~/kadai/kadai9-8 $ delete_seek5 size: 120(バイト) printf1data_tel.txtのサイズ: 120 確保したメモリブロックのアドレス: 02B92AF8 naka ,090-7777 kiyoko ,090-9999 satou ,090-3214 kinosita ,090-8679 yamada ,090-4325 itou ,080-6354 読み込みデータなし fseek:0 naka@naka ~/kadai/kadai9-8 $ ```
回答: `if (buff == NULL)` この判定文がおかしいですね。fgetsでEOFに到達したかどうかを判定するなら `if (ptr == NULL)` としなければなりません。buffは配列ですからこのif文が成立することはあり得ないわけです。EOFに到達したかどうかはwhile文の条件でチェックされてはいますが、上記if文でEOFかどうかの判定をし損ねているため、EOFに達しているにもかかわらずbuffの中身を表示しており、それが本件の現象の原因です。 本来EOFに達した際に「読み込みデータなし」と表示されるように意図していたと思いますが、それが表示されずにプログラムが終了した点について気付けたらご自分でもわかったかも知れませんね。 余談ですが、getFileSize関数のif文のbraceが抜けているように思います。インデンテーションからいえば以下のようにするつもりだったのだと思います。 ``` if (stat(file, &statBuf) == 0) { // <=== braceが必要 // ファイルfileからファイル情報を取得し、 // stat構造体変数statBuf)に格納する。 size = (int)(statBuf.st_size); // サイズを取得 printf("size: %d(バイト)\n",size); // 表示 return statBuf.st_size; } // <=== braceが必要 return -1L; } ``` またせっかくgetFileSizeでエラーチェックをやっていますが、呼び出し元のmain関数の中で結果が-1かどうかお構いなしに先に進めています。main関数でのエラーチェック漏れではないですか?