< p > C语言函数如< code > fscanf() 和< code > fgets() 是如何记住从文件哪个位置开始读取的呢?例如,使用< code > fscanf() 读取文件时,它似乎记住了上次终止的位置,而不是从文件开头重新开始。这是如何实现的呢?
FILE *
参数指向一个缓冲区和文件句柄(请参见fileno()
函数)。FILE *
指针指向文件中的某个位置。这并不是字面上的真相,但对于初学者来说,这种解释可能是正确的。struct file
的数组(此类型未在用户空间定义,因此不要去查找),其中包含它打开的所有文件。通过open()
系统调用返回一个句柄,该句柄仅是数组中的一个索引。函数fileno()
从fopen()
返回的FILE *
指针中检索句柄,并且可以直接操作。除了访问ioctl()
或fctl()
时,通常不建议这样做,否则您将与FILE
对象中的内部缓冲区进行斗争。
struct file
的成员之一是loff_t f_pos
,它是内核read()
或write()
停止的确切字节位置。这在FILE
中进行了缓存,它知道它预读或暂停写入的字节数。
FILE *
参数的作用。 - kaylumfseek
进行调整的是同一位置。 - M.M