Как сохранить указанные c строки в файле в переменные в C - PullRequest
0 голосов
/ 01 февраля 2020

Так, если, например, у меня есть файл со следующим содержанием:

STUDENTS: Three
NAME 1: Andy
NAME 2: Becky
NAME 3: Chris
TYPE: Undergrads

Я хотел бы извлечь имена студентов в массив.

Я попытался реализовать это с помощью fscanf, например, это работает, и я могу сохранить «Три» в структуре студента:

fscanf(fptr, "STUDENTS: %s\n", student.count);

Так что я попробовал некоторые варианты этого (где count это число строк в файле), но массив имен остается пустым:

int *num = NULL;
*num = 1;
int j;
for (j=0; j<count; j++) {
   if (j != 0 && j != count-1) {
       fscanf(fptr, "NAME %d: %s\n", num, student.names[j]);
       *num+=1;
   }
}

Есть ли лучший метод, чем fscanf, например, fseek (), с которым я не очень знаком. Любые идеи будут оценены, спасибо.

edit:

struct Students {

  char *name;
  char *type;
  char *connections[6];

};

struct Students student;

1 Ответ

2 голосов
/ 01 февраля 2020

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

char tag[MAX_TAG_SIZE], value[MAX_VALUE_SIZE];
if (fscanf(f, "%[^:]: %s ", tag, value) != 2) error("bad line format");

Эта строка формата получает любые серии символов, кроме :, в tag , Затем он пропускает : с последующим пробелом. Затем он получает слово без пробелов в value с последующим пропуском пробелов (включая переводы строки). Последний бит готов к вводу для сканирования следующего тега, что важно. Самая большая ошибка, которую новые C программисты делают с scanf, забывает правильно обрабатывать пробелы во входном потоке.

Теперь вы можете проверить тег, чтобы увидеть, что делать дальше:

if (strcmp("STUDENTS", tag) == 0) {
   ... Handle students value
} else if(strcmp("TYPE", tag) == 0) {
   ... Handle type value
} else if (strncmp("NAME", tag, 4) == 0) {
    if (sscanf(tag + 4, "%d", &name_number) != 1) error("bad name number");
    ... Handle name_number and value
} else error("unexpected tag");
...