我可以从头开始读取一个以追加模式打开的文件而不需要初始化fseek()吗?

问题描述 投票:1回答:1

当一个现有的非空文件被成功打开时,可以用 fopen()"a+""ab+" 模式下,我应该能够从它那里读到或写到最后,而不需要初始调用到 fseek()rewind(). C标准是否规定从这个文件的初始读取将从文件的开头读取,还是说我应该在读取之前总是设置文件的位置?

C标准似乎含糊不清,因为它在下面写道 7.21.5.2 fopen 功能 那。

6. 用追加模式打开一个文件(a 为首 mode 参数)导致所有后续对文件的写入都被强制到当时的文件末尾,而不管中间是否有对 fseek 函数。在一些实施例中,用追加模式打开二进制文件(bmode 参数值)可能会因为空字符填充而将流的文件位置指示器初始定位在最后写入的数据之外。

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

c language-lawyer fopen fseek
1个回答
1
投票

行为是由实现定义的。

7. 21. 3文件

1 流通过打开文件与外部文件(可能是物理设备)相关联,这可能涉及创建一个新文件。创建一个现有的文件会导致其以前的内容被丢弃,如果必要的话。如果文件可以支持定位请求(例如磁盘文件,而不是终端),那么与流相关联的文件位置指示器被定位在文件的开始(字符数zero),除非文件是用追加模式打开的,在这种情况下,文件位置指示器最初被定位在文件的开始还是结束是由实施定义的。文件位置指示器会被后续的读、写和定位请求所维护,以方便文件的有序进展。

所以调用 rewind()fseek(fp, 0L, SEEK_SET) 是在从打开更新模式的文件开头读到结尾的初始读之前所需要的,由以 "a+""ab+".

© www.soinside.com 2019 - 2024. All rights reserved.