c-我可以从一开始就读取一个在没有初始fseek()的情况下以附加模式打开的文件吗



fopen()"a+""ab+"模式下成功打开现有的非空文件时,我应该能够从中读取或写入到末尾,而无需对fseek()rewind()进行初始调用。C标准是否规定从该文件的初始读取将从文件的开头读取,或者我应该在读取之前始终设置文件位置?

C标准似乎不明确,因为它在7.21.5.2中规定了fopen函数

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

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

行为由实现定义:

7.21.3文件

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

因此,在从为更新模式/写入打开的文件开始到结束的初始读取之前,需要调用rewind()fseek(fp, 0L, SEEK_SET),这由以"a+""ab+"开头的模式字符串决定。

相关内容

最新更新