fgets() 如何跟踪它在哪一行?

ros*_*tex 4 c file stream

此代码正确地逐行读取文件,将每一行存储在 line[] 中并打印出来。

int beargit_add(const char* filename) {
    FILE* findex = fopen(".beargit/.index", "r");

    char line[FILENAME_SIZE];
    while(fgets(line, sizeof(line), findex)) {
        strtok(line, "\n");
        fprintf(stdout, "%s\n", line);
    }
    fclose(findex);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,我很困惑为什么在 while 循环中使用 fgets() 实际上是逐行读取文件的。在学习了 Python 和 Java 之后,我是 C 的新手。

由于对 fgets() 的每次调用都是独立的,所以每次调用它时,C 在哪里记住它当前在哪一行?我认为这可能与将值更改为FILE* index点有关,但是您将指针按值传递给 fgets(),因此无法对其进行修改。

非常感谢任何帮助理解 C 的魔力!

sim*_*xia 5

这不是 fgets 跟踪,findex这是为你做的

findex是一种FILE类型,其中包括有关打开文件的信息,例如文件描述符、文件偏移量

FILE 是OS中I/O的封装。

更多关于:文件

标识流并包含控制流所需信息的对象类型,包括指向其缓冲区的指针、位置指示符和所有状态指示符。

而偏移量是为了跟踪文件,每次读取文件时,都是从偏移量开始。所有这些工作都由FILE,它为您完成,并为fgets

有关偏移偏移 wiki 的更多信息