fgets()如何跟踪所在行?

4
这段代码正确地逐行读取文件,将每行存储在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语言的奥秘!

如果我没记错的话,它是在内部处理的。 - Sourav Ghosh
我愿意学习这个内部的魔法! - rosstex
2个回答

5

不需要使用fgets来跟踪文件,findex会为您完成这项工作。

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

FILE是操作系统中I/O的封装。

更多信息请参见:FILE

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

偏移量用于跟踪文件,每次读取文件时,它都从偏移量开始。所有这些工作都由FILE完成,它为您完成了这项工作,也包括fgets

有关偏移量的更多信息,请参见偏移量维基百科


4
我认为这可能与更改FILE* index指向的值有关,但实际上并非更改指针本身。该指针指向一个结构体(类型为FILE),其中包含有关与该结构体/指针关联的流的信息。可能,该结构体的一个成员包含指向下一字节的“光标”。
或者,它只有一个文件描述符int(像许多Unix系统一样),I/O函数只是调用内核以获取文件描述符的信息,包括当前位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接