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