以“a+”模式打开文件

Posted

技术标签:

【中文标题】以“a+”模式打开文件【英文标题】:Opening a file in 'a+ 'mode 【发布时间】:2010-09-05 05:33:19 【问题描述】:

如果使用以下命令打开文件:

FILE *f1=fopen("test.dat","a+");

手册页内容如下:

一个+

打开以进行读取和附加(在文件末尾写入)。这 如果文件不存在,则创建该文件。初始文件位置 读取是在文件的开头,但输出是 总是附加到文件的末尾。

那么f1 是否有 2 个独立的偏移量指针,一个用于读取,另一个用于写入?

【问题讨论】:

【参考方案1】:

没有。

只有一个指针最初位于文件的开头,但当尝试写入操作时,它会移动到文件的末尾。您可以在文件中的任何位置使用fseekrewind 重新定位它以进行读取,但写入操作会将其移回文件末尾。

【讨论】:

了解这通常是在 POSIX 系统上使用带有 O_APPEND 标志的“打开”来实现的,这可能也很有用:pubs.opengroup.org/onlinepubs/7908799/xsh/open.html 如果在读取之前没有调用 fseek,下面的代码中会打印很多空格。我期望什么都不会在屏幕上打印。但是为什么要打印空格?这意味着没有正确遇到 EOF。如果我在下面取消注释 fseek,则数据会正确打印在屏幕上。 int main() FILE *fp1; char ch; fp1=fopen("m.txt", "a+"); fputs("data appended", fp1); //fseek(fp1,0,SEEK_SET); while((ch=getc(fp1))!=EOF) putc(ch,stdout); fclose(fp1); return 0; 【参考方案2】:

不,它只有一个指针。

【讨论】:

【参考方案3】:

您可以永远FILE 上混合读取和写入操作,而无需在两者之间调用fseek。它可能在某些实现上如您所愿,但依赖于此的程序具有未定义的行为。因此,有2个职位的问题是没有意义的。

【讨论】:

是的。但是,如果您看到支持 POSIX 文件操作的操作系统的 C 实现,并且 stdio FILE 操作不是 POSIX 上的薄缓冲层(确实在此定义了行为案例),将其报告为针对该操作系统的错误。 @DairaHopwood:我对你想说的话感到困惑。在没有中间搜索的情况下混合读取和写入 stdio 的问题纯粹是缓冲问题。它与文件描述符的底层操作无关。 我的意思是,如果 stdio 实现在这种情况下的未定义行为导致除了更改写入缓冲数据的位置(如果有的话)之外的任何事情,我认为它存在错误。也就是说,规范应该是生成的文件内容是实现定义的,而不是真正未定义的行为。否则你会发现很多程序都有可利用的安全漏洞。 不,这不是越野车。例如,如果调用者违反了接口契约的这一部分,一个非常好的实现将是执行__asm__("hlt"); 或类似的。但是,即使它破坏了内存,这仍然不是错误。该错误存在于调用 UB 的应用程序中。

以上是关于以“a+”模式打开文件的主要内容,如果未能解决你的问题,请参考以下文章

以“a+”模式打开文件

python--17 文件

Python文件操作大全

python学习笔记4-python文件操作

基于python的文件处理

文件操作的常用方法和使用