I/O 操作自体をテストします。Pascal を書いている場合以外は使用しfeof()
ないでください (C は Pascal ではありません!)
#include <stdio.h>
int main(void)
{
FILE *f = fopen("book2.txt", "r");
char a[200];
if (f != 0)
{
while (fscanf(f, "%199s", a) == 1)
{
printf("%s ", a);
printf("%ld\n", ftell(f));
}
putchar('\n');
fclose(f);
}
return 0;
}
改訂されたコードはf
、使用前にテストを行い、文字列の長さを変換仕様に指定することでバッファ オーバーフローを防止することに注意してください。%s
空白文字まで読み取ることに注意してください。各行に空白がない限り、行は読み取られません。
トラブル報告feof()
などの操作後の変換失敗、I/O エラー、EOF を区別するために使用します。fscanf()
例えば:
#include <stdio.h>
int main(void)
{
FILE *f = fopen("book2.txt", "r");
char a[200];
if (f != 0)
{
while (fscanf(f, "%199s", a) == 1)
{
printf("%s ",a);
printf("%ld\n", ftell(f));
}
putchar('\n');
if (feof(f))
printf("EOF\n");
else if (ferror(f))
printf("I/O error\n");
else
printf("Conversion failed\n");
fclose(f);
}
return 0;
}
を使用%s
すると、変換に失敗することはなく、I/O エラーもほとんどありません。ただし、変換指定子が の場合%d
、データ内の句読点文字により「変換に失敗しました」というメッセージが表示される可能性があります。
25 年以上に及ぶ C コーディングの中で、私のコードにfeof()
は数千のファイルのうち 2 か所があり (私は数か月前に確認しました)、どちらの場合も、コードは EOF とエラーを区別しています (おおむね図の通り)。