3

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?

8
  • 1
    The code you show allocates an array then leaks it (by returning 0 rather than grades). You haven't shown any code that'd try reading values from file. Commented Sep 30, 2013 at 11:38
  • Also, is the program supposed to work with input redirection? How are supposed to read the file? Commented Sep 30, 2013 at 11:39
  • malloc() returns the pointer to allocated memory having garbage values, you yourself have to assign the values to allocated memory Commented Sep 30, 2013 at 11:39
  • i don't get anything when i reading !!! make the question proper. Do you want to return array from function? Commented Sep 30, 2013 at 11:39
  • I'm sorry if it's unclear: I want a function readGrades that reads the grades from the input(file) and that return a dynamically allocated array in which they are stored Commented Sep 30, 2013 at 11:41

2 Answers 2

5

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);  
Sign up to request clarification or add additional context in comments.

6 Comments

Op just now wrote he's piping in the file on command line, so the program should read from stdin (which it does). Important part is your last line: Actually return the pointer to the array that was allocated.
can't you use ./a.out < 1.in instead of fopen, fscanf to read the inputfile?
I changed return NULL; to return grades, so it should return them, however still nothing =(.
@SvenS: You're right, apologies, I overlooked that ` < 1.in`.
Thank you, it makes much more sense with another scanf :P
|
3

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;


}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.