C函数如何记住文件中读取的起始位置,例如fscanf()和fgets()?

6
< p > C语言函数如< code > fscanf() 和< code > fgets() 是如何记住从文件哪个位置开始读取的呢?例如,使用< code > fscanf() 读取文件时,它似乎记住了上次终止的位置,而不是从文件开头重新开始。这是如何实现的呢?


这就是 FILE * 参数的作用。 - kaylum
@kaylum,你能详细解释一下吗?我想要对此有一个良好的概念性理解。我应该提到我很清楚如何使用FILE *,但我不知道它承担了这个功能。请详细说明一下。 - The Pointer
它们存储了上次读取的位置。这与您使用 fseek 进行调整的是同一位置。 - M.M
@M.M 我原本以为 FILE * 只是存储文件在目录中的位置?所以它也会存储 fscanf() 和 fgets() 等函数读取/写入文件时的确切位置吗? - The Pointer
只需看一下您的用户名。 - Kaz
显示剩余5条评论
1个回答

6
FILE *参数指向一个缓冲区和文件句柄(请参见fileno()函数)。
实际的位置信息被记在内核中的文件结构中。
有一个传说,FILE *指针指向文件中的某个位置。这并不是字面上的真相,但对于初学者来说,这种解释可能是正确的。
事实上,发生的情况如下:每个进程在内核中都有一个类型为struct file的数组(此类型未在用户空间定义,因此不要去查找),其中包含它打开的所有文件。通过open()系统调用返回一个句柄,该句柄仅是数组中的一个索引。函数fileno()fopen()返回的FILE *指针中检索句柄,并且可以直接操作。除了访问ioctl()fctl()时,通常不建议这样做,否则您将与FILE对象中的内部缓冲区进行斗争。 struct file的成员之一是loff_t f_pos,它是内核read()write()停止的确切字节位置。这在FILE中进行了缓存,它知道它预读或暂停写入的字节数。

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