このリンクfeof()
は、ループの終了インジケーターとして使用するのが悪い理由について説明しています。
安全でない ==> feof()
while にチェックがあり、while のfgets()
中にあります。
安全==> fgets()!=NULL
while自体にチェックがあります。
安全でないコードが余分な while ループの反復を行っているのを確認することになっていますが、どちらも同じ (かつ正しい) ループ回数を行っています。誰かがここで何が起こっているのか理解するのを手伝ってくれますか?
編集:リンクは実際にこれが起こっている理由を述べていましたが、私が読んでいるものを正確に理解するには、以下の正しい答えが必要でした. 私のファイルには最後の行に「\ n」がなかったため、同じ結果が得られました。
これはファイルの内容です:
abcd
efgh
ijkl
コードは次のとおりです。
void testUnsafe(void) {
FILE *f;
char buf[20];
f = fopen("fil.txt", "r");
while (!feof(f)) {
fgets(buf, 20, f);
if (buf[strlen(buf) - 1] == '\n') //cleaner
buf[strlen(buf) - 1] = '\0';
printf("%s , %d\n", buf, strlen(buf));
}
fclose(f);
}
void testSafe(void) {
FILE *f;
char buf[20];
f = fopen("fil.txt", "r");
while (fgets(buf, 20, f) != NULL) {
if (buf[strlen(buf) - 1] == '\n') //cleaner
buf[strlen(buf) - 1] = '\0';
printf("%s , %d\n", buf, strlen(buf));
}
fclose(f);
}
出力は次のとおりです。
******unsafe test********
abcd , 4
efgh , 4
ijkl , 4
********safe test********
abcd , 4
efgh , 4
ijkl , 4