Как мне прочитать файл, пока не встретится новая строка - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть текстовый файл с блоками студенческих данных. E.g.:

student number 
name 
number of subjects 
subject code 1
subject code 2
subject....... etc

student number
name
..
.. etc

Моя проблема возникает, когда я хочу прочитать коды предметов, поскольку в каждом блоке будет разное количество предметов, в которых мне нужно просто прочитать каждый предмет, пока не останется больше предметов. Там будет пустая строка. Поэтому я хочу создать цикл, который будет читать до новой строки.

Кстати, каждый блок сохраняется в массив структур.

Попытался использовать strcmp, но не был уверен, что я делал, иначе понятия не имею.

for(int j = 0; j < 8; j++) {
  fscanf(fptr,"%s",gRecs->subject[j].subjectcode);
  fscanf(fptr,"%d",&gRecs->subject[j].enrolnmentstat);
  fscanf(fptr,"%d",&gRecs->subject[j].mark);

  printf("%s\n",gRecs->subject[j].subjectcode);
  printf("%d\n",gRecs->subject[j].enrolnmentstat);
  printf("%d\n",gRecs->subject[j].mark);

}

Мне нужно добавить цикл while внутри цикла for, чтобы он сбрасывался при обнаружении пустой строки.

Цикл for таков, что каждый из них сохраняется в отдельном массиве структур, 8 - это сумма, заданная назначением.

1 Ответ

0 голосов
/ 15 апреля 2019

Как и предполагали другие, вы можете использовать fgets для этого. И если вы не знаете количество предметов, которые будут перечислены заранее, то что-то вроде этого может сработать:

#include <stdio.h>
#include <stdlib.h>

#define MAXBUFF 128

int main()
{
    FILE* fp = fopen("stud", "r");

    char line[MAXBUFF];
    if (fp)
    {
        while (1)
        {
            char* c = NULL;
            while ((c = fgets(line, MAXBUFF, fp)) != NULL)
            {
                if (line[0] == '\n')
                {
                    printf("new student info's coming!\n");
                    break;
                }

                /* sscanf(...line...) -> process the line we just read */
                printf("%s", line);
            }

            if (c == NULL)
                break;
        }

        fclose(fp);
    }
    else
    {
        printf("Error opening file...");
    }
}

Вероятно, вам понадобится какой-то итератор во внешнем цикле while, чтобы обеспечить некоторую индексацию для вашего массива структур.

И, возможно, еще один во внутреннем цикле, если предметы, хранящиеся в структуре, также хранятся в каком-то массиве.

В любом случае, это будет читать весь файл. И если встретится новая строка, то она разорвет внутренний цикл, и вы сможете перейти к следующему студенту во внешнем цикле. Надеюсь, это поможет каким-то образом!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...