像fscanf()和fgets()这样的函数如何记住从文件中的何处开始读取?

像fscanf()和fgets()这样的函数如何记住从文件中的何处开始读取?,c,C,例如,当使用fscanf()读取文件时,它似乎记住了文件最后一次在哪里终止,而不是从文件的开头重新开始。有人能详细说明一下这到底是怎么回事吗?我发现很难使用这些函数,因为我不了解这个组件。参数FILE*指向缓冲区和文件句柄(请参阅fileno()函数) 文件结构中内核中的实际存储位置 有一个图例,文件*指针指向该文件。这并不是字面上的正确,但对于刚开始的程序员来说也是正确的 事实上,发生的情况如下:每个进程在内核中都有一个数组,其类型为struct file(此类型未在用户空间中定义,因此不要查

例如,当使用
fscanf()
读取文件时,它似乎记住了文件最后一次在哪里终止,而不是从文件的开头重新开始。有人能详细说明一下这到底是怎么回事吗?我发现很难使用这些函数,因为我不了解这个组件。

参数
FILE*
指向缓冲区和文件句柄(请参阅
fileno()
函数)

文件结构中内核中的实际存储位置

有一个图例,
文件*
指针指向该文件。这并不是字面上的正确,但对于刚开始的程序员来说也是正确的

事实上,发生的情况如下:每个进程在内核中都有一个数组,其类型为
struct file
(此类型未在用户空间中定义,因此不要查找它),其中包含所有打开的文件。
open()
syscall返回一个句柄,它只是数组的索引。函数
fileno()
fopen()
返回的FILE*指针中检索句柄,可以直接操作。这通常是一个坏主意,除了访问
ioctl()
fctl()
之外,因为您最终会与
文件中的内部缓冲区发生冲突


struct file
的一个成员是
loff\u t f\u pos
,它是内核
read()
write()
停止的确切字节位置。这是缓冲在
文件中的
,它知道它提前读取了多少字节,或者等待以后写入。

这就是
文件*
参数的作用。@kaylum您能详细说明一下吗?我想从概念上理解这一点。我应该提到的是,我很清楚使用FILE*,但我不知道它承担了这个功能。请详细说明。它们存储上次读取的位置。这与您正在调整的
fseek
@M.M相同,我以为FILE*只将文件位置存储在目录中?因此,它还准确地存储了文件函数(如fscanf()和fgets()读取/写入的位置),该参数存储了内部状态,包括
fd
(文件描述符)。
fd
由内核管理,内核跟踪每个fd在文件中的位置(以及其他内容)。谢谢,Joshua。你能详细说明一下到底发生了什么事吗?我想从概念上了解一下这里发生了什么。