动态分配整数数组,将它们存储在文件中并在c中找到它们的平均值

时间:2019-05-02 16:19:59

标签: c file dynamic malloc

我目前正在解决有关动态内存分配的任务,它说我应该动态分配一个整数数组,将它们以表的形式存储在文件中,然后查找并打印这些数字的平均值。打印平均值,我得到错误的结果。

#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

2 个答案:

答案 0 :(得分:2)

您的代码中存在两个主要问题。

  1. 在第一个循环中将数据写入文件时,应使用空格或换行符分隔数字,例如

    fprintf(fp,"%d\n",*(tab+i));
    
  2. 在写入和读取文件之间,您应该回到开头。在两个循环之间插入

    fseek(fp, 0, SEEK_SET);
    

在某些情况下,代码中还有更多错误可能导致问题:

功能feof()仅在 个读取操作后才能使用,例如fscanf之后,以区分EOF或错误。

完成后,您应该fclose文件。

您应检查所有功能的结果,例如fopen未返回NULL指针,scanffscanf成功转换了预期的项目数,...

答案 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);
}