C编程在编译器中显示txt FILE

时间:2016-08-14 09:05:44

标签: c file

这段代码就像一个魅力。但是,最后两行输出是相同的,你可以在这里看到。

这里有什么问题?

数据来自之前构建的txt文件。

1 CADBURY 999 1.900000
2 PEPSI 999 2.500000
3 IPHONE 976 2500.000000
4 SPIRULINA 100 50.000000
2 PAIPSI 100 0.900000
10 BLACKMORE 98 30.000000
17 TROPICANA 13 1.500000
17 TROPICANA 13 1.500000

以下是代码:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <ctype.h>

int addProduct();

struct product {
    int quantity, reorder, i, id;
    char name[20];
    float price;
};

int main() {
    FILE *fp;
    int i = 0;
    struct product a;

    system("cls");

    char checker;
    int counter;

    do {
        fp = fopen("addproduct.txt", "a+t");
        system("cls");

        printf("Enter product ID : ");
        scanf(" %d", &a.id);

        printf("Enter product name : ");
        scanf(" %s", a.name);

        printf("Enter product quantity : ");
        scanf(" %d", &a.quantity);

        printf("Enter product price : ");
        scanf(" %f", &a.price);

        fprintf(fp, "%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);
        printf("Record saved!\n\n");

        fclose(fp);

        printf("Do you want to enter new product? Y / N : ");

        scanf(" %c", &checker);
        checker = toupper(checker);

        i++;

        system("cls");
    } while(checker == 'Y');

    if (checker == 'N') {
        fp = fopen("addproduct.txt", "r");

        while (!feof(fp)) {
            fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price);
            printf("%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);
        }
        fclose(fp);
    }
    return(0);
}

2 个答案:

答案 0 :(得分:0)

当您在程序结束时打印出文件的内容时,fscanf函数在尝试读取文件末尾之前不会设置feof。 这意味着在您读取文件中的最后一行后,feof仍然不正确。 所以循环继续,然后fscanf尝试读取另一行但失败。所以变量a.id,a.name等与之前循环执行fscanf之后的变量相同。 在打印结果之前,您应该检查fscanf是否已返回预期的字段数。 例如,

... if(fscanf(fp,“%d%s%d%f”,&amp; a.id,a.name,&amp; a.quantity,&amp; a.price)== 4)    printf(“%d%s%d%f \ n \ n”,a.id,a.name,a.quantity,a.price); ...

会解决问题。

编辑:对不起4个参数不是5,修复了

答案 1 :(得分:0)

while (!feof(fp))无法正常工作:feof(fp)仅在输入失败后才变为。在上一次迭代期间,fscanf()失败,但您没有检查其返回值,并且前一次迭代的值由最后printf()使用。

你应该写:

while (fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price) == 4) {
    printf("%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);
}