Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在编译器中显示txt文件的C程序设计_C_File - Fatal编程技术网

在编译器中显示txt文件的C程序设计

在编译器中显示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 代

目前,这套代码非常有效。但是,最后两行输出与您在这里看到的相同

这里有什么问题

数据来自先前构建的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);
}
#包括
#包括
#包括
#包括
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种转换规范。