这段代码就像一个魅力。但是,最后两行输出是相同的,你可以在这里看到。
这里有什么问题?
数据来自之前构建的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);
}
答案 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);
}