fgets()如何跟踪它所在的行?

时间:2015-02-04 07:04:47

标签: c file stream

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

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的魔力!

2 个答案:

答案 0 :(得分:4)

不是fgets跟踪,findex为你做这件事

findexFILE类型,其中包含有关打开文件的信息,例如文件描述符,文件偏移量

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

更多关于:FILE

  

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

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

有关offset offset wiki

的更多信息

答案 1 :(得分:3)

  

我认为这可能与将FILE* index点值更改为

有关

指针本身不会被更改。指针指向一个结构(类型为FILE),该结构包含与该结构/指针相关的流的信息。据推测,该结构的一个成员包含一个“光标”,指向要读取的下一个字节。

或者它可能只是有一个文件描述符int(就像很多Unices一样)而I / O函数只是调用内核来获取有关文件描述符的信息,包括当前位置。