使用feof读取直到文件结束

时间:2017-07-15 19:32:40

标签: c

所以我已经阅读了多篇关于为什么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);
} 

2 个答案:

答案 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()函数数据之一。