为什么平均价格是一串英文呐?哪里出错了?真心求解!
#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
显示这个一般是除零,或者浮点数超过范围了。
fgets(str, 100, pfile); 读取一行,后面的价格就读不进来了。
价格读不进来,average里number则为0