【问题标题】:How does fgets() keep track of what line it's on?fgets() 如何跟踪它在哪一行?
【发布时间】:2015-04-03 14:54:31
【问题描述】:

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

【问题讨论】:

  • 如果我没记错的话,是内部处理的。
  • 我愿意学习这种内在的魔法!

标签: c file stream


【解决方案1】:

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

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

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

更多关于:FILE

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

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

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

【讨论】:

    【解决方案2】:

    我认为这可能与更改 FILE* index 指向的值有关

    改变的不是指针本身。指针指向一个结构(FILE 类型),该结构包含有关与该结构/指针关联的流的信息。据推测,该结构的其中一个成员包含一个“光标”,指向要读取的下一个字节。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2014-10-06
      • 2020-09-10
      相关资源
      最近更新 更多