【问题标题】:Dynamically allocating an array of integers,storing them in a file and finding the average of them in c动态分配整数数组,将它们存储在文件中并在 c 中找到它们的平均值
【发布时间】:2019-09-21 05:13:02
【问题描述】:

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

#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

【问题讨论】:

  • OT:为了便于阅读和理解:1) 请始终缩进代码。在每个左大括号“{”后缩进。在每个右大括号 '}' 之前取消缩进。建议每个缩进级别为 4 个空格。 2)单独的代码块:forifelsewhiledo...whileswitchcasedefault通过一个空行。 3) 遵循公理:每行只有一个语句,并且(最多)每条语句有一个变量声明。
  • OT:调用fopen()时,始终检查(!=NULL)返回值以确保操作成功。如果不成功调用:perror() 将您的错误消息和系统认为错误发生的文本原因输出到stderr
  • 不要使用 feof 但检查 scanffscanf 返回 1(在您的情况下)
  • OT:关于:tab=(int*)malloc(n*sizeof(int)); 1) 返回的类型是void*,可以分配给任何指针。强制转换只会使代码混乱,使其更难以理解、调试等。 2) 始终检查 (!-NULL) 返回值以确保操作成功。如果不成功,调用perror()将你的错误信息和系统认为错误发生的文本原因输出到stderr
  • 关于:for(i=0;i&lt;n &amp;&amp; !(feof(fp));i++){ 表达式:!(foef(fp)) 不符合您的预期。类似的考虑存在于:for(i=0;i&lt;n &amp;&amp; !(feof(fp));i++){

标签: c file dynamic malloc


【解决方案1】:

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

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

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

    fseek(fp, 0, SEEK_SET);
    

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

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

完成后您应该fclose 文件。

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

【讨论】:

  • add feof 不得使用,但 OP 必须检查 scanf 和 fscanf 返回 1(在这种情况下)。可以解释更多,在整数打印之间没有分隔符,结果是一个整数
【解决方案2】:

您需要在每个输入的数字后写一个'\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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    相关资源
    最近更新 更多