【发布时间】: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