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

How does fgets() keep track of what line it's on?

此代码正确地逐行读取文件,将每一行存储在 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;
}

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

之后,我是 C 的新手

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

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

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

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

FILE是I/O在OS中的封装。

更多关于:FILE

Object type that identifies a stream and contains the information needed to control it, including a pointer to its buffer, its position indicator and all its state indicators.

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

关于偏移量的更多信息offset wiki

I thought it might have to do with changing the value FILE* index points to

不是指针本身被改变了。该指针指向一个结构(FILE 类型),该结构包含与 structure/pointer 关联的流的相关信息。据推测,该结构的一个成员包含一个指向下一个要读取的字节的 "cursor"。

或者它可能只是有一个文件描述符 int(就像在许多 Unice 上一样)并且 I/O 函数只是调用内核以获得有关文件描述符的信息,包括当前位置。