c - 如何读取文件直到遇到换行符

标签 c

我有一个包含学生数据 block 的文本文件。例如:

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

student number
name
..
.. etc

当我想读入主题代码时,我的问题就出现了,因为每个 block 都有不同数量的主题,我需要读入每个主题,直到没有更多主题为止。那里就是空行所在的地方。因此我想创建一个循环来读取直到新行。

顺便说一句,每个 block 都保存到一个结构数组中。

尝试过使用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 是赋值给定的数量。

最佳答案

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

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

无论如何,这将读取整个文件。如果遇到新行,它将中断内部循环,您可以继续处理外部循环中的下一个学生。 希望这能在某种程度上有所帮助!

关于c - 如何读取文件直到遇到换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55684606/

相关文章:

c - 如何使用 C 宏将字符串分成多个部分?

c - 为什么 SDL 使 3 个事件提前发生?

c - 在 C 中使用 foo() && 0 安全吗?

c - 循环重复 scanf 和 printf

c - 函数内部的静态数组错误 C

c - 使用信号在父进程和多个子进程之间进行进程同步

c - 如何使用 C 通过串行端口将十六进制数据发送到自定义仪器中?

c - 如何在 C 中生成一个随机 int?

c - 从文件的前 N ​​个文件中读取数字

c - mqueue:消息太长