以“a+”模式打开文件
Posted
技术标签:
【中文标题】以“a+”模式打开文件【英文标题】:Opening a file in 'a+ 'mode 【发布时间】:2010-09-05 05:33:19 【问题描述】:如果使用以下命令打开文件:
FILE *f1=fopen("test.dat","a+");
手册页内容如下:
一个+
打开以进行读取和附加(在文件末尾写入)。这 如果文件不存在,则创建该文件。初始文件位置 读取是在文件的开头,但输出是 总是附加到文件的末尾。
那么f1
是否有 2 个独立的偏移量指针,一个用于读取,另一个用于写入?
【问题讨论】:
【参考方案1】:没有。
只有一个指针最初位于文件的开头,但当尝试写入操作时,它会移动到文件的末尾。您可以在文件中的任何位置使用fseek
或rewind
重新定位它以进行读取,但写入操作会将其移回文件末尾。
【讨论】:
了解这通常是在 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+”模式打开文件的主要内容,如果未能解决你的问题,请参考以下文章