[当在fopen()
或"a+"
模式下通过"ab+"
成功打开一个现有的非空文件时,我应该能够从该文件读取或写入结尾,而无需初始调用fseek()
或rewind()
。 C标准是否指定从此文件的初始读取将从文件的开头读取,还是应该在读取之前始终设置文件位置?
C标准似乎含糊不清,因为它在7.21.5.2 fopen
函数中指出:
6。以追加模式打开文件(
a
作为mode
参数中的第一个字符)会导致所有对该文件的后续写入都被强制到当前的末尾-file,而不管对fseek
函数的调用。在某些实现中,由于以下原因,打开带有追加模式的二进制文件(b
作为上述mode
参数值列表中的第二个或第三个字符)可能会最初将流的文件位置指示符定位在最后写入的数据之外。空字符填充。
在那些文件位置指示符指向或超过最后写入的数据的系统上,初始读取操作会失败吗?
行为是实现定义的:
7.21.3文件
[1通过打开文件将流与外部文件(可以是物理设备)相关联,这可能涉及创建新文件。如果需要,创建一个现有文件会导致其以前的内容被丢弃。如果文件可以支持定位请求(例如磁盘文件,而不是终端文件),则与流关联的文件位置指示符将位于开始位置(字符号)零),除非以附加模式打开文件,否则在这种情况下,实现方式是由文件位置指示符最初位于文件的开头还是结尾来定义的。文件位置指示符通过后续的读取,写入和定位请求来维护,以利于整个文件的有序进行。
因此,从打开文件开始以进行更新模式/写到文件的末尾进行初始读取之前需要调用rewind()
或fseek(fp, 0L, SEEK_SET)
,这取决于以"a+"
或"ab+"
开头的模式字符串。