我目前正在解决有关动态内存分配的任务,它说我应该动态分配一个整数数组,将它们以表的形式存储在文件中,然后查找并打印这些数字的平均值。打印平均值,我得到错误的结果。
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp=fopen("some.txt","w+");
printf("How many numbers are you going to input?\n");
int n,i;
scanf("%d",&n);
int *tab;
int sum=0;
tab=(int*)malloc(n*sizeof(int));
for(i=0;i<n && !(feof(fp));i++){
printf("Enter a number:\n");
scanf("%d",tab+i);
fprintf(fp,"%d",*(tab+i));
}
for(i=0;i<n && !(feof(fp));i++){
fscanf(fp,"%d",tab+i);
printf("%d\t",*(tab+i));
sum+=*(tab+i);
}
float mean=sum/(float)n;
printf("%f\n",mean);
free(tab);
}
这是一个示例输入,应该打印出我写到文件中的所有数字,并作为最后的平均值,它应该已经打印了4.6666(对于这三个特定的输入来说就是这样)>
How many numbers are you going to input?
3
Enter a number:
4
Enter a number:
5
Enter a number:
5
4 1.333333
答案 0 :(得分:2)
您的代码中存在两个主要问题。
在第一个循环中将数据写入文件时,应使用空格或换行符分隔数字,例如
fprintf(fp,"%d\n",*(tab+i));
在写入和读取文件之间,您应该回到开头。在两个循环之间插入
fseek(fp, 0, SEEK_SET);
在某些情况下,代码中还有更多错误可能导致问题:
功能feof()
仅在 个读取操作后才能使用,例如fscanf
之后,以区分EOF或错误。
完成后,您应该fclose
文件。
您应检查所有功能的结果,例如fopen
未返回NULL
指针,scanf
或fscanf
成功转换了预期的项目数,...
答案 1 :(得分:0)
在尝试读取文件内容之前,需要在每个输入的数字后写一个'\ n'并将文件位置设置为文件的开头。.
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp=fopen("some.txt","w+");
printf("How many numbers are you going to input?\n");
int n,i;
scanf("%d",&n);
int *tab;
int sum=0;
tab=(int*)malloc(n*sizeof(int));
for(i=0;i<n && !(feof(fp));i++){
printf("Enter a number:\n");
scanf("%d",tab+i);
fprintf(fp,"%d\n",*(tab+i));
}
rewind(fp);
for(i=0;i<n && !(feof(fp));i++){
fscanf(fp,"%d",tab+i);
printf("%d\t",*(tab+i));
sum+=*(tab+i);
}
float mean=sum/(float)n;
printf("%f\n",mean);
free(tab);
}