标准C 库中fopen() 的a+模式是什么意思?
我有一个应用程序,它 fopen 一个文件,处于 a+ 模式,锁定它,读取其全部内容,然后截断它并写入。
该应用程序在Linux下工作正常,但在Cygwin下运行失败。显然它在文件中没有读到任何内容。我不得不添加 fseek(f, 0, SEEK_SET) 行,显式地将文件指针定位到开头。
我不知道这个应用程序为什么会失败。要么Linux在读取时恰好在文件开头,而标准允许在文件的任意位置读取;要么Cygwin未能遵循标准(也许出于必要性,也许Windows没有独立的读写位置)。
因此,我想了解赋予 fopen() 的 a+ 模式的语义是什么。
写入大概总是写在文件末尾,对吗?
但读取呢?实现是否被允许也从文件末尾开始读取?还是符合规范的实现应该从开头读取并始终写在末尾?
解决方案
实现是否也被允许从文件末尾开始读取?
可以。
a+ ...
POSIX is silent on what the initial read position is when using this mode. For glibc, the initial file position for reading is at the beginning of the file, but for Android/BSD/MacOS, the initial file position for reading is at the end of the file.
(emphasis is mine)
不仅从开头读取并非强制的,还有系统明确记录初始位置在末尾。
Cygwin未被特别提及,但看起来这是一个有效的选择。
因此使用 fseek(就像你做的那样)是正确的做法。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。