像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。你能详细说明一下到底发生了什么事吗?我想从概念上了解一下这里发生了什么。