れお さんが書きました:19行目:なぜわざわざ=NULLにするのかわかりません。これの行は別になくてもいいんですよね?
head.next は何のためにあるのでしょうか?
リストの先頭のノード(SRec型)を指すためです。
これが NULL だと、リストにはまだ 1つもノードがないことを表します。
これが NULL でないと、リストに最低 1つはノードがあることになります。
実際にはまだリストは空っぽですよね。だから NULL にします。
今回の場合、head はグローバル変数ですから、実は head.next は NULL になっています。
そういう意味ではこの行はなくてもいいんですが、上記のことをちゃんと理解していましたか?
れお さんが書きました:21行目:なぜwhile( )のところを (!=feof) にしてはいけないんですか?(fpi!=EOF)ならいいんですかね??たしかに(1)にするとずっとループするのでそれでいけるのはわかるのですが。
input.txt という名前のファイルがあったとします。内容は次の通り。
コード:
3.5 27 jiro
2.7 24 taro
3.7 30 saburo
3行目の最後にも改行文字があるものとします。
次のプログラムを実行してみてください。
コード:
#include <stdio.h>
int main(void)
{
float gpa;
int credit;
char name[200];
int n = 0;
FILE *fp = fopen("input.txt", "r");
if (!fp) return 1;
while (!feof(fp)) {
fscanf(fp, "%f%d%s", &gpa, &credit, name);
printf("gpa=%.1f, credit=%d, name=%s\n", gpa, credit, name);
n++;
}
printf("n=%d\n", n);
return 0;
}
実行結果
コード:
gpa=3.5, credit=27, name=jiro
gpa=2.7, credit=24, name=taro
gpa=3.7, credit=30, name=saburo
gpa=3.7, credit=30, name=saburo
n=4
3行目が 2つ出ていますよね。なぜだかわかりますか?
fscanf が 3行目のデータを読み込んでも、まだ入力には改行文字が残っていますから、
feof(fp) は 0 のままです。
while (!feof(fp)) は ループを続け、4回目の fscanf を呼び出します。
fscanf が失敗したかどうかを見ていませんから 4行目を読み込んだと勘違いして
n は 4 になります。
コード:
#include <stdio.h>
int main(void)
{
char buf[200];
int n = 0;
FILE *fp = fopen("input.txt", "r");
if (!fp) return 1;
while (!feof(fp)) {
fgets(buf, sizeof(buf), fp);
fputs(buf, stdout);
n++;
}
printf("n=%d\n", n);
return 0;
}
このプログラムでは 3行目の改行文字まで読み込んでしまいますが、fgets はそこで
読み込みをやめてしまうので、まだ EOF にぶつからず feof(fp) は 0 のままです。
feof() はそれ以前の入力関数が EOF に達したかどうかを示すもので、これが 0 だから
といって、次の入力関数が必ず成功することを保証するものではありません。
ファイルの終わりのチェックは、入力関数の返す値をみて行うものです。
れお さんが書きました:65行目:これは何をしているのですか?
Input の中で malloc が失敗した場合 NULL が返ってきますから、それをチェックしています。