Чтение чисел из файла в динамически распределяемый массив
Мне нужна функция, которая читает оценки (целые числа) из файла и возвращает динамически распределенный массив, в котором они хранятся.
Вот что я попробовал:
int *readGrades() {
int *grades;
int x;
scanf("%d", &x);
grades = malloc(x * sizeof(int));
return 0;
}
Однако я ничего не получаю, когда запускаю код. Оценки хранятся в файле под названием 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
и я запускаю свою программу, используя: ./a.out < 1.in
Может кто-нибудь сказать мне, что я сделал не так?
2 ответа
Проблема: следующий код:
int *readGrades() {
int *grades;
int x;
scanf("%d", &x);
grades = malloc(x * sizeof(int));
return 0;
}
читает 1 int
из стандартного ввода, то он выделяет массив int
и это return
s 0
который нулем инициализирует указатель вызывающей стороны при использовании так:
int* grades = readGrades();
Решение: кроме чтения количества оценок, функция также должна считывать оценки. Массив должен быть инициализирован ДО чтения, а фактическое чтение оценок должно выполняться в цикле, который инициализирует элементы массива. В конце должен быть возвращен указатель на первый элемент:
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);
Надеюсь, вы ищете следующую программу. Это читает ваш grades.txt, создает память и, наконец, освобождается. Я протестировал следующую программу, и она отлично работает.
#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;
}