所以我已经阅读了多篇关于为什么feof
无法正常工作的帖子,他们都利用while(fscanf(...) == 1)
来读取文件结尾,我遇到的问题是我有临时每个循环的值都不同,因为它正在读取处理它的每一行,然后移动到下一行。我目前的代码正确读取所有输入,但打印最后一行两次。我想知道是否有更好的方法来解决这个问题,而不仅仅是做一个黑客工作并删除最后一行处理,因为它被处理了两次。
void readInputFile(Customer customers[]) {
FILE *input = fopen("hw4input.txt", "r");
while (!feof(input)) {
char tempName[MAXNAMELEN];
int tempQuantity;
char tempItem[MAXNAMELEN];
double tempPrice;
fscanf(input, "%s %d %s $%lf", &tempName, &tempQuantity, &tempItem, &tempPrice);
printf("%s %d %s %.2lf\n", tempName, tempQuantity, tempItem, tempPrice);
}
printf("EOF\n");
fclose(input);
}
答案 0 :(得分:2)
在尝试从文件中读取之前,不能使用feof()
来检测文件结尾。只有在尝试从文件中读取数据失败后,feof()
才会返回文件结束状态。
您应该从流中读取值,使用fscanf()
获取快速且脏掉的玩具程序,或使用fgets()
获取更强大的解析器:
void readInputFile(Customer customers[]) {
FILE *input = fopen("hw4input.txt", "r");
if (input != NULL) {
char name[1024];
int quantity;
char item[1024];
double price;
while (fscanf(input, "%1023s %d %1023s %lf", name, &quantity, item, &price) == 4) {
printf("%s %d %s %.2lf\n", name, quantity, item, price);
}
printf("EOF\n");
fclose(input);
} else {
printf("Cannot open input file\n");
}
}
答案 1 :(得分:1)
我想知道是否有更好的方法可以解决这个问题,而不仅仅是做一个黑客工作并删除最后一行处理
是的,有。
检查代码中fscanf
的返回值。当您尝试读取文件末尾时,调用将失败。
无论如何你应该检查它。甚至有很多人在这里发帖,他们认为你不应该使用任何*scanf()
函数,因为如果不是不可能以任何强有力的方式使用它们将非常困难。几乎总有一种方法可以提供导致问题的*scanf()
函数数据之一。