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

动态分配整数数组,将它们存储在文件中,并在c中查找它们的平均值,c,file,dynamic,malloc,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");

我目前正在解决一个关于动态内存分配的赋值问题,它说我应该动态分配一个整数数组,将它们以表格的形式存储在一个文件中,然后查找并打印这些数字的平均值。但是当涉及到打印平均值时,我得到了错误的结果

#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);
}

代码中有两个主要问题

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

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

    fseek(fp, 0, SEEK_SET);
    
  • 代码中还有一些错误,在某些情况下可能会导致问题:

    函数
    feof()
    只能在读取操作之后使用,例如在
    fscanf
    之后使用,以区分EOF或错误

    完成后,您应该
    fclose
    文件


    您应该检查所有功能的结果,例如,
    fopen
    没有返回
    NULL
    指针,
    scanf
    fscanf
    成功转换了预期的项目数,…

    您需要在每个输入的数字后写一个“\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);
    }
    
    #包括
    #包括
    int main(){
    文件*fp=fopen(“some.txt”,“w+”);
    printf(“您要输入多少个数字?\n”);
    int n,i;
    scanf(“%d”和“&n”);
    int*选项卡;
    整数和=0;
    tab=(int*)malloc(n*sizeof(int));
    
    对于(i=0;iOT:为了便于阅读和理解:1),请一致地缩进代码。在每个左大括号“{”之后缩进。在每个右大括号“}之前缩进“.建议每个缩进级别为4个空格。2)单独的代码块:
    用于
    如果
    否则
    执行时…当
    切换
    时,通过一个空行执行
    默认值
    。3)遵循公理:每行只有一条语句,并且(最多)每个语句一个变量声明。OT:调用
    fopen()
    时,始终检查(!=NULL)返回值以确保操作成功。如果不成功,则调用:
    peror()
    要同时输出错误消息和系统认为发生错误的文本原因,请不要使用feof,而是检查scanf和fscanf返回1(在您的情况下)OT:About:
    tab=(int*)malloc(n*sizeof(int));
    1)返回的类型是
    void*
    ,可以分配给任何指针。强制转换只会使代码变得混乱,使其更难理解、调试等。2)始终检查(!-NULL)返回值以确保操作成功。如果不成功,请调用
    peror()
    要同时输出错误消息和文本原因,系统认为stderr发生错误的原因与:
    for(i=0;不得使用iadd feof,但OP必须检查scanf和fscanf返回1(在is情况下)。可能会解释更多的说法,即在整数打印之间没有分隔符,结果是一个整数
    
    #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);
    }