【问题标题】:How is "file position" implemented in a stream (FILE)?如何在流(FILE)中实现“文件位置”?
【发布时间】:2020-10-03 00:52:11
【问题描述】:

在《C Programming: A Modern Approach》一书的第 22 章中,作者对文件位置的概念进行了简短的介绍。提供了以下描述:

每个流都有一个关联的文件位置。打开文件时,文件位置设置在文件的开头。 (但是,如果文件以“追加”模式打开,则初始文件位置可能在文件的开头或结尾,具体取决于实现。)然后,当执行读取或写入操作时,文件位置会前进自动,允许我们以顺序的方式在文件中移动。

在这一段之后,作者深入探讨了几个与“文件位置”概念相关的<stdio.h>函数(例如fseekftell等)。

我最近发了一个帖子 (What is the difference between a pointer to a buffer and a pointer to a file?),所提供的答案/反馈让我对流,FILEFILE * 的实际含义有了一个不错的初学者理解。在这篇文章中还向我揭示了缓冲区可以自动(“默认”在调用fopen 时创建)这一事实。

所以我的问题实际上是一个请求:有人可以更详细地向我提供文件位置到底是什么?它是指向与fopen 相关的缓冲区的指针吗?如果它不是 指向缓冲区 的指针,它是否以某种方式暴露了指向缓冲区指针的某种对应关系?大概文件位置存储在FILE 中。等等等等。

非常感谢任何见解!干杯~

【问题讨论】:

    标签: c file buffer stdio


    【解决方案1】:

    文件位置是与底层文件“句柄”相关联的数字。该句柄将是类 POSIX 系统上的文件描述符(严格来说是“打开文件描述”而不是“打开文件描述符”,但您暂时可以忘记这种区别 - 有关更多信息,请参阅 POISX open())。它可能是 Windows 上的“HANDLE”(但我保留在这方面犯错的权利)。这无关紧要,因为FILE * 抽象将您(程序员)与底层细节隔离开来。

    文件位置指定从将发生活动(读取或写入)的文件开头的偏移量(以字节为单位)。通过读取或写入数据或通过寻找新位置来更改位置。内核(操作系统)跟踪该位置,并在必要时移动它。文件流 (FILE *) 指向的结构也可以跟踪其数据中的位置。那是因为它必须确保对缓冲区的更改正确地反映在文件中,并且文件中的更改正确地反映在缓冲区中。缓冲区包含与文件中某些位置范围相关的数据。该范围会随着数据的读取或写入或程序在文件上的查找而变化。

    【讨论】:

    • 感谢您的周到回复!因此,为了澄清起见,已读入缓冲区的数据与 FILE * 指向的 FILE 对象中存储的文件位置之间存在对应关系。对吗?
    • 是的——读入缓冲区(或写入缓冲区)的数据与文件位置之间存在对应关系。
    猜你喜欢
    • 2016-04-08
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2017-04-05
    • 2010-12-03
    • 2013-04-25
    相关资源
    最近更新 更多