我试图逐行读取文件中的值并打印它们..输出是它打印最后一行两次..为什么它会这样做,因为最后一行是文件的结尾?
int main(int argc, char* argv[]) {
FILE *file = fopen(argv[1], "r");
if (file == NULL){
printf("error\n");
return 1;
}
unsigned long long address;
int rv = fscanf(file, "%lli", &address);
printf("%lli\n", address);
do{
rv = fscanf(file, "%lli", &address);
printf("%lli\n", address);
} while (rv!=EOF);
fclose(file);
return 0;
}
答案 0 :(得分:4)
您不检查“内部”fscanf
是否实际成功。如果你在文件的末尾,它将不会读取任何内容,&address
没有得到更新,rv
获取0
读取的字节。
然后你无条件地打印出address
中的任何内容,这恰好是你最后成功阅读的内容 - 最后一行。
不要使用do / while,请使用while()
while((rv = fscan(...)) != EOF) {
printf(...);
}
这样,如果fscanf失败,就不会执行printf。
do / while基本上是“至少执行以下一次”,而while
是“执行以下零次或多次”。