【问题标题】:I'm having a hard time understanding the fgets() function我很难理解 fgets() 函数
【发布时间】:2021-12-29 19:46:58
【问题描述】:

我正在准备下周的考试,我很难理解 C 中的 fgets() 函数。

举个例子:

void main() {
    FILE *fp;
    char buff[2]
    fp = fopen("test.txt", "r");

    while (fgets(buff, sizeof(buff), fp)
    /*I understand that this loop returns true aslong 
    as End-of-File is not encountered*/

    printf("%s", buff);

    fclose(fp)
}

据我了解,这个循环将获得一个包含 2 个元素(1 个字符 + '\0')的 char 数组,它如何知道跳过已经获得的元素?和fp指针有关系吗?

【问题讨论】:

  • fgets 来自file-get-string。您尝试读取一个字符串而不是 2 个元素的 char 数组。阅读cplusplus.com/reference/cstdio/fgets
  • @Akali 你错了。只读取一个字符。不附加换行符。
  • FILE *fp 句柄会跟踪很多内部变量,例如文件中的位置等等。
  • 简短的回答是“某事”会跟踪您打开的文件句柄的位置(这里抽象为fp 指向的FILE)。什么和如何取决于底层文件是如何实现的。
  • @Cheatah 在FILE 的内部变量中没有必要跟踪该位置。考虑直接从文件描述符中读取,这只是一个int,但那些也保持位置。例如,操作系统可能会跟踪该位置。

标签: c pointers fgets


【解决方案1】:

FILE 是用于流的对象类型和实现缓冲区以及指向该缓冲区的指针的抽象。 fgets() 将流中的数据处理到您提供给gets() 的数组中,并推进指针。

这个例子implementation 可能具有指导意义。

在 glibc 中,fgets()__fgets_unlocked() 的宏,最终调用 _IO_getline_info()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2010-11-07
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多