Read numbers from file into a dynamically allocated array

12,757

Solution 1

Problem: The following code:

int *readGrades() {
    int *grades;
    int x;
    scanf("%d", &x);
    grades = malloc(x * sizeof(int));
    return 0;
}

reads 1 int from the standard input, THEN it allocates an array of ints and it returns 0 which zero-initializes caller's pointer when used like this:

int* grades = readGrades();

Solution: Apart from reading the count of grades, the function should read the grades as well. The array should be initialized BEFORE the reading and the actual reading of grades should be done in a loop, which would initialize array's elements. At the end, a pointer to the first element should be returned:

int *readGrades(int count) {
    int *grades = malloc(count * sizeof(int));
    for (i = 0; i < count; ++i) {
        scanf("%d", &grades[i]);
    }
    return grades;                // <-- equivalent to return &grades[0];
}
...
int count;
scanf("%d", &count);              // <-- so that caller knows the count of grades
int *grades = readGrades(count);  

Solution 2

Hopefully, you are looking for the following program. This reads your grades.txt, creates the memory and finally frees up. I have tested the following program, and it works fine.

#include "stdio.h"


int main(int argc, char *argv[])
{
  FILE *fp;
  int temp;
  int *grades = NULL;
  int count = 1;
  int index;

  fp = fopen("grades.txt","rb+");

  while( fscanf(fp,"%d",&temp) != EOF )

  {


    if( grades == NULL )

     {

       grades = malloc(sizeof(temp));
       *grades = temp;

       printf("The grade is %d\r\n",temp);
     }

    else
    {
       printf("The grade is realloc %d\r\n",temp);
       count++;
       grades = realloc(grades,sizeof(grades)*count);
       index = count -1;
       *(grades+index) = temp;
       //printf("the index is %d\r\n",index);

    }  

  }   


   /** lets print the data now **/

   temp = 0;

    while( index >= 0 )
    {

        printf("the read value is %d\r\n",*(grades+temp));
        index--;
        temp ++;

    }

    fclose(fp);

    free(grades);
    grades = NULL;


}
Share:
12,757
user2831017
Author by

user2831017

Updated on June 27, 2022

Comments

  • user2831017
    user2831017 almost 2 years

    I need a function that reads grades (integers) from from file and returns a dynamically allocated array in which they are stored.

    This is what I have tried:

    int *readGrades() {
    int *grades;
    int x;
    scanf("%d", &x);
    grades = malloc(x * sizeof(int));
    return 0;
    }
    

    However I don't get anything when I run the code. The grades are stored in file called 1.in:

    29
    6 3 8 6 7 4 8 9 2 10 4 9 5 7 4 8 6 7 2 10 4 1 8 3 6 3 6 9 4
    

    and I run my program using: ./a.out < 1.in

    Can anyone tell me what I did wrong?