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

fscanf()fgets()这样的C函数如何记住从文件中的何处开始读取?例如,当使用fscanf()读取文件时,它似乎记住了文件最后一次在哪里终止,而不是从文件的开头重新开始。这到底是怎么回事

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

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

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

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

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

发表评论