我有一个文本文件,其中包含学生数据块。例如:
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。
答案 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循环中使用某种迭代器,以便为结构数组提供一些索引。
如果存储在结构中的主题也存储在某种数组中,则可能是内部循环中的另一个主题。
无论如何,这将读取整个文件。如果遇到新的一行,它将打破内循环,您可以继续外循环中的下一个学生。 希望这会有所帮助!