例如,在使用时读取文件时fscanf(),似乎记得最后一次终止的位置,而不是再次从文件的开头开始.有人可以详细说明这是如何工作的吗?我发现很难使用这些功能,因为我不理解这个组件.
该FILE *参数指向缓冲区和文件句柄(请参阅fileno()函数).
实际在文件结构中的内核中记住的位置.
有一个图例FILE *指针指向文件.这不是字面意义,但对于初级程序员的解释可能也是如此.
实际上发生的情况如下:每个进程都有一个类型内核中的数组struct file(此类型未在用户空间中定义,因此不要寻找它)包含所有打开的文件.open()syscall 返回一个句柄,它只是数组的索引.该函数fileno()从返回的FILE*指针中检索句柄fopen(),可以直接操作.这通常是个坏主意,除了访问ioctl()或fctl()最终与FILE对象中的内部缓冲区作斗争.
其中一个成员struct file是loff_t f_pos内核read()或write()停止的确切位置(以字节为单位).这是缓冲的,FILE它知道它前面读取了多少字节或者为后来的写入而写入.