在编译器中显示txt文件的C程序设计
目前,这套代码非常有效。但是,最后两行输出与您在这里看到的相同 这里有什么问题 数据来自先前构建的txt文件在编译器中显示txt文件的C程序设计,c,file,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 代
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);
}
#包括
#包括
#包括
#包括
int addProduct();
结构产品{
整数数量,再订购,i,id;
字符名[20];
浮动价格;
};
int main(){
文件*fp;
int i=0;
结构产品a;
系统(“cls”);
字符检查器;
整数计数器;
做{
fp=fopen(“addproduct.txt”,“a+t”);
系统(“cls”);
printf(“输入产品ID:”);
scanf(“%d”和a.id);
printf(“输入产品名称:”);
scanf(“%s”,a.name);
printf(“输入产品数量:”);
scanf(“%d”和a.数量);
printf(“输入产品价格:”);
scanf(“%f”和a.price);
fprintf(fp,“%d%s%d%f\n\n”,a.id,a.name,a.quantity,a.price);
printf(“已保存记录!\n\n”);
fclose(fp);
printf(“是否要输入新产品?是/否:”);
scanf(“%c”、&checker);
checker=toupper(checker);
i++;
系统(“cls”);
}while(checker='Y');
如果(检查程序=='N'){
fp=fopen(“addproduct.txt”、“r”);
而(!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);
}
返回(0);
}
当您在程序末尾打印出文件内容时,fscanf函数不会设置feof,直到它尝试读取文件末尾。
这意味着在读取文件中的最后一行之后,feof仍然不是真的。
因此循环继续,fscanf然后尝试读取另一行,但失败。因此,变量a.id、a.name等与前一个循环执行fscanf后的变量相同。
在打印结果之前,应该检查fscanf是否返回了预期数量的字段。
比如说,
。。。
如果(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);
会解决这个问题
编辑:抱歉,4个参数不是5,已修复当您在程序结束时打印文件内容时,fscanf函数不会设置feof,直到它尝试读取超过文件结尾的内容。 这意味着在读取文件中的最后一行之后,feof仍然不是真的。 因此循环继续,fscanf然后尝试读取另一行,但失败。因此,变量a.id、a.name等与前一个循环执行fscanf后的变量相同。 在打印结果之前,应该检查fscanf是否返回了预期数量的字段。 比如说, 。。。 如果(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); 会解决这个问题 编辑:抱歉,4个参数不是5个,修复了(!feof(fp))未按预期工作时的问题:
feof(fp)
仅在输入失败后变为true。在上一次迭代中,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);
}
而(!feof(fp))
未按预期工作:feof(fp)
仅在输入失败后变为true。在上一次迭代中,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);
}
很抱歉问你。所以,4只是一个随机数,或者我需要为它设置一个计数器?
4
是由fscanf()
成功执行的转换数:%d
,%s
,%d
和%f
。谢谢你,摇滚乐!上帝保佑:)对不起问了。所以,4只是一个随机数,或者我需要为它设置一个计数器?4
是由fscanf()
成功执行的转换数:%d
,%s
,%d
和%f
。谢谢你,摇滚乐!上帝保佑:)fscanf格式字符串只有4种转换规范。fscanf格式字符串只有4种转换规范。