Динамически выделяя массив целых чисел, сохраняя их в файле и находя среднее их в - PullRequest
0 голосов
/ 02 мая 2019

В настоящее время я решаю задачу о динамическом распределении памяти, и она говорит, что я должен динамически выделить массив целых чисел, сохранить их в виде таблицы в файле, затем найти и напечатать среднее из этих чисел. Но когда это произойдетчтобы напечатать среднее, я получаю неправильные результаты.

#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 ]

2 голосов
/ 02 мая 2019

В вашем коде есть две основные проблемы.

  1. При записи данных в файл в первом цикле вы должны разделять числа пробелом или новой строкой, например,

    fprintf(fp,"%d\n",*(tab+i));
    
  2. Между записью и чтением файла вы должны вернуться к началу.Между двумя циклами вставьте

    fseek(fp, 0, SEEK_SET);
    

В коде есть еще несколько ошибок, которые могут привести к проблемам в некоторых случаях:

Функция feof() может бытьиспользуется только после операции чтения, например, после fscanf, чтобы различать EOF или ошибки.

Вам следует fclose файл, когда вы закончите.

Youследует проверить результат всех функций, например, чтобы fopen не возвращал указатель NULL, чтобы scanf или fscanf успешно преобразовали ожидаемое количество элементов, ...

0 голосов
/ 02 мая 2019

Вам нужно написать '\ 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);
}
...