C - структура в массиве (и целый ряд других проблем) - PullRequest
0 голосов
/ 24 мая 2018

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

Поскольку я учусь с фоном Паскаля в затылке, иногда это становится довольно запутанным, особенно с новыми правилами и синтаксисом для структур и массивов

Это то, что мой код (сокращен)выглядит так:

typedef struct {
    char *name;
    char *age;
} Person;
void write_lines_to_terminal(Person person_array[], int numberOfLines) {
   for (int i = 0; i < numberOfLines; i++)
    {
        printf("name: %s, age: %s\n", person_array[i].name, person_array[i].age);
    }
}

void read_lines_to_terminal(FILE *file_ptr) {
  my_string string;
  int i;
  int numberOfLines;
  fscanf(file_ptr, "%d", &numberOfLines);
  Person person_array[numberOfLines];
  for (i=0; i < numberOfLines; i++) {
    fscanf(file_ptr, "%[^\n]\n", person_array[i].name);
    fscanf(file_ptr, "%[^\n]\n", person_array[i].age);
  }
  write_lines_to_terminal(person_array, numberOfLines);
 }

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

Любая помощь или предложение в мой код будет высоко ценится.

РЕДАКТИРОВАТЬ: Добавлено определение личности

1 Ответ

0 голосов
/ 24 мая 2018

fscanf() не возвращает значение, которое было прочитано, оно возвращает количество входов, которые были успешно прочитаны.Вы должны предоставить указатели на местоположения для хранения входных данных в качестве аргументов.

fscanf(file_ptr, "%[^\n]\n%[^\n]\n", person_array[i].name, person_array[i].age);

Вам также необходимо прочитать после новой строки после количества строк, прежде чем вы начнете читать строки данных.Измените это на:

fscanf(file_ptr, "%d\n", &numberOfLines);

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

typedef struct {
    char name[100];
    char age[4];
} Person;

Я не уверен, почему вы используете строку для возраста вместо int.

...