c语言中从文件读取数据出错了,读取的是小数,然后计算它的平均数,输出的是一串英文?求解!

为什么平均价格是一串英文呐?哪里出错了?真心求解!

img

img


#include
float price[100];
void input() {
    FILE* pfile = fopen("E:\\Visual Studio 2022 project\\文件2题目\\s.txt", "r");
    char str[100];//临时储存一本书的书名
    char ch;//判断文件是否结尾
    printf("读取到书本的数据:\n");
    for(int n=0;;n++){
        fgets(str, 100, pfile);
        fscanf(pfile, "价格:%f", &price[n]);
        puts(str);
        for (int i = 0; i < 100; i++) {
            str[i] = 0;
        }//清除str中的数据
        if (ch = fgetc(pfile) == EOF) {
            break;
        }
        fseek(pfile, -1, SEEK_CUR);//由于fgetc回向后面移动一个字符,所以要用fseek函数往前移动一个字符
    }

    fclose(pfile);
}
void average() {
    float data=0;
    float sum = 0;
    float number = 0;
    for (int i = 0;; i++) {
        if (price[i] == NULL) {
            break;
        }
        number++;
    }
    for (int i = 0; i < number; i++) {
        sum += price[i];
    }
    data = sum / number;
    printf("平均价格为:%.3f", data);
}
int main() {
    input();//自定义input函数读入
    average();//自定义函数average算出平均价格
    return 0;
}

应该是因为fgets()和fscanf()读取数据的方式不能正确读取目标文件的数据,根据下面的参考链接没有使用 fscanf(pfile, "价格:%f", &price[n])的方式来读取价格数据的方法,另外fgets()直接读取了一行数据也导致读取价格数据错误。

如果是使用fscanf()来读取价格数据时,如果"价格:"字符串和实际价格数据之间没有空格,需要使用一些方法从读取的数据中提取价格,但是如果在"价格:"字符串和实际价格数据之间加一个空格,就可以让读取价格数据简单很多,所以根据以上分析,修改如下:

参考链接:

 
#include<stdio.h>
float price[100];
void input() {
    FILE* pfile = fopen("F:\\s.txt", "r");   //这个目录修改成你电脑下文件的目录
    char str[100];//临时储存一本书的书名
    char ch;//判断文件是否结尾
    printf("读取到书本的数据:\n");
    for(int n=0;;n++){
       // fgets(str, 100, pfile);
        fscanf(pfile,"%s",str); //读取条形码数据 
        printf("%s ",str);
        fscanf(pfile,"%s",str); //读取书名数据 
        printf("%s ",str);
        // https://baike.baidu.com/item/fscanf/10942374?fr=aladdin
        fscanf(pfile, "%s%f", str,&price[n]); //读取价格数据 
        printf("%s %f\n",str, price[n]);
        
        for (int i = 0; i < 100; i++) {
            str[i] = 0;
        }//清除str中的数据
        if ((ch = fgetc(pfile)) == EOF) {
            break;
        }
        fseek(pfile, -1, SEEK_CUR);//由于fgetc回向后面移动一个字符,所以要用fseek函数往前移动一个字符
    }
 
    fclose(pfile);
}
void average() {
    float data=0;
    float sum = 0;
    float number = 0;
    for (int i = 0;; i++) {
        if (price[i] == NULL) {
            break;
        }
        number++;
    }
    for (int i = 0; i < number; i++) {
        sum += price[i];
    }
    data = sum / number;
    printf("平均价格为:%.3f", data);
}
int main() {
    input();//自定义input函数读入
    average();//自定义函数average算出平均价格
    return 0;
}

s.txt(测试文件内容--价格:后面加个空格):

条形码:1 书名:红楼梦 价格: 35.00
条形码:2 书名:三国演义 价格: 45.00
条形码:3 书名:水浒传 价格: 56.00

img

显示这个一般是除零,或者浮点数超过范围了。
fgets(str, 100, pfile); 读取一行,后面的价格就读不进来了。
价格读不进来,average里number则为0