ftell()在追加模式下返回的文件指针位置的初始值

时间:2017-10-23 15:20:04

标签: c file-handling fseek ftell

我正在查看SO帖子fseek does not work when file is opened in "a" (append) mode,当我们在" a"中打开文件时,我对ftell()返回的文件指针的初始值有疑问。模式。 我尝试使用包含数据" Hello Welcome"并在各个地方打印指针的位置。 最初ftell()将返回位置0.在追加后,ftell()将返回最后一个位置。如果我们做fseek()文件指针得到改变,在这种情况下我移回到0位置。 在追加模式下,我们无法读取数据。为什么指针最初处于0位置?在追加模式中是否还有使用fseek?

Date starttimesampTime = new Date(Long.parseLong(startTimestamp));

Long epoch = starttimesampTime.getTime() / 1000;

2 个答案:

答案 0 :(得分:2)

你问

  

为什么指针最初处于0位置?

您可以在一般性层面上获得的唯一答案,因为它是您的特定实施所做出的选择。标准说:

  

如果文件可以支持定位请求(例如磁盘文件,则为   与终端相对),然后是与之关联的文件位置指示符   流位于开头(字符编号为零)的位置   文件,除非文件是以附加模式打开的,在这种情况下它是   实现 - 定义文件位置指示符是否   最初位于文件的开头或结尾。

C2011, 7.21.3/1

因此,实现可以选择将位置初始设置为文件的开头,或者将其设置为以追加模式打开的文件的结尾。前者与在任何其他模式下打开文件时的行为一致,并反映下一次读取将发生的位置(对于允许读取的附加模式,例如" a +");后者反映了第一次写入的位置。我赞成前者,我自己,因为你不能依赖于在追加模式下打开的文件的文件位置来反映下一次写入的位置(位置总是可以通过fseek()来改变。

  

在附加模式中是否也有使用fseek?

其主要用途与仅在追加模式下打开的文件无关。我不准备说它没有没有使用,但我当然不希望它因为传递给它而错误输出。问题表明你对文件位置有错误的概念。除了首次打开文件之外,它(对于支持它的流)只是该流上最后一次I / O操作产生的位置,其中fseek()真正的 I / O操作。

当然,fseek()对于正常阅读和追加文件的使用非常明智。

答案 1 :(得分:1)

  

为什么指针最初处于0位置?

这似乎是一个特定于实施的细节。我在C标准中找不到专门提到纯附加模式下打开的文件的初始文件偏移量的参考。

  

在附加模式中是否也有使用fseek?

在纯追加模式下,如果无法阅读,fseek()似乎无效。每 7.21.5.3 fopen函数the C standard的第6段:

  

使用追加模式打开文件('a'作为第一个字符   在mode参数中)导致所有后续写入   文件被强制转换为当前的文件结尾,无论如何   干预fseek功能的呼叫。 ...

但是,根据第7段,在追加/更新模式"a+"中打开,对fseek()的调用可用于定位当前文件指针以供阅读:

  

以更新模式打开文件时('+'作为上述mode参数列表中的第二个或第三个字符   值),输入和输出都可以在   相关流。 ...

因此,fseek()必要从追加/更新模式的文件中读取,以便在写入当前位置之后将当前位置定位到当前结束之外的其他位置文件。