C语言fgets()函数读取文件时跳过已读内容的原理疑问
问题核心解答
fgets()能够自动跳过已读取内容,完全由传入的FILE类型指针fp实现。
C标准库中,FILE是一个封装了文件操作相关信息的结构体,其中就包含了当前文件位置偏移量的属性,专门用来记录当前读写操作在文件中对应的字节位置。
每次调用fgets(buff, sizeof(buff), fp)时的执行逻辑是:
- 从
fp内部记录的当前偏移量位置开始读取数据 - 最多读取
sizeof(buff) - 1个有效字符(如果提前遇到换行符\n或者文件结束符EOF就终止读取),读取完成后自动在缓冲区末尾补\0形成合法C字符串 - 读取结束后,
fp内部的偏移量会自动往后移动「本次实际读取到的字节数」,下次调用同fp的读写函数时,就会从新的偏移量位置开始操作,不会重复读取之前的内容
你对缓冲区的理解是完全正确的:你示例中buff长度为2,所以每次调用fgets最多存入1个有效字符+1个\0,每次读取完成后fp的偏移量就往后移动1个有效字符对应的字节数,直到读完整个文件。
注意:你贴出的示例代码存在几处语法笔误,考试书写时需要修正:
char buff[2]、fclose(fp)末尾缺少分号while的判断条件末尾缺少右括号,且循环体没有用大括号包裹- 标准C规范中
main函数的返回值应为int而非void
内容的提问来源于stack exchange,提问作者angelsen
相关产品推荐
相关产品推荐

