我如何读取文件,直到遇到新的一行

时间:2019-04-15 07:47:23

标签: c

我有一个文本文件,其中包含学生数据块。例如:

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);

}

我需要在for循环中添加一个while循环,以便在遇到空行时将其重置。

for循环是这样,每个循环都保存到一个单独的结构数组中,赋值给定的数量为8。

1 个答案:

答案 0 :(得分:0)

正如其他人所建议的那样,您可以使用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循环中使用某种迭代器,以便为结构数组提供一些索引。

如果存储在结构中的主题也存储在某种数组中,则可能是内部循环中的另一个主题。

无论如何,这将读取整个文件。如果遇到新的一行,它将打破内循环,您可以继续外循环中的下一个学生。 希望这会有所帮助!