【问题标题】:Can I read from the beginning a file open for append mode without an initial fseek()?我可以在没有初始 fseek() 的情况下从头开始读取以追加模式打开的文件吗?
【发布时间】:2020-05-08 17:24:15
【问题描述】:

fopen()"a+""ab+" 模式下成功打开一个现有的非空文件时,我应该能够从它读取或写入到最后,而无需初始调用fseek() 或@987654326 @。 C 标准是否指定从此文件的初始读取将从文件开头读取,或者我应该始终在读取之前设置文件位置?

C 标准似乎模棱两可,因为它在 7.21.5.2 fopen 函数中声明:

6. 以附加模式打开文件(a 作为mode 参数中的第一个字符)会导致对文件的所有后续写入被强制到当时的当前文件结尾,而不管对 fseek 函数的干预调用。在某些实现中,以附加模式打开二进制文件(b 作为上述mode 参数值列表中的第二个或第三个字符)可能最初将流的文件位置指示符定位在最后写入的数据之外,因为空字符填充。

在文件位置指示器指向或超出最后写入数据的那些系统上,初始读取操作会失败吗?

【问题讨论】:

  • POSIX documentation,更新模式"+"似乎是一个红鲱鱼:即使对于常规读取模式"r",也没有指定读取应该从头开始(等效地对于模式"w")。它仅通过引用 open 函数来暗示,该函数描述了所需的语义。]
  • @usr:我不确定你的意思,如果文件以更新模式打开,则读写都是可能的。问题是在fopen() 之后发出的读取操作是从文件开头读取还是尝试从文件末尾读取并且可能会失败。更准确地说,如果需要rewind() 以确保从文件开头进行读取。对此的规范不在fopen() 函数的描述中。
  • @usr:我确实在断言读取是一个定义的操作。它是在初始读取开始的地方定义的实现,因此在实践中明确设置文件位置似乎是必要的。

标签: c language-lawyer fopen fseek


【解决方案1】:

行为由实现定义:

7.21.3 文件

1 流通过打开文件与外部文件(可能是物理设备)相关联,这可能涉及创建新文件。如有必要,创建现有文件会导致其以前的内容被丢弃。如果文件可以支持定位请求(例如磁盘文件,而不是终端),则与流关联的文件位置指示符位于开头(字符编号 零),除非文件以附加模式打开,在这种情况下,文件位置指示符最初定位在文件的开头还是结尾是由实现定义的。文件位置指示器由后续的读取、写入和定位请求维护,以促进文件的有序推进。

因此,在从为更新模式打开的文件开头进行初始读取之前,需要调用rewind()fseek(fp, 0L, SEEK_SET) 到末尾,这由以"a+" 或@987654324 开头的模式字符串确定@。

【讨论】:

  • @usr: 好的,问题是 C 标准是否指定从该文件的初始读取将从文件的开头读取,还是我应该始终在读取之前设置文件位置? ,我会更新标题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
相关资源
最近更新 更多