辞辞辞辞歌 2023-01-11 19:39 采纳率: 85.7%
浏览 45
已结题

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

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

img

img


#include<stdio.h>
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;
}
  • 写回答

3条回答 默认 最新

  • a5156520 2023-01-11 20:24
    关注

    应该是因为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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月12日
  • 已采纳回答 1月11日
  • 创建了问题 1月11日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。