在同一个文件上连续两次写入

时间:2013-09-28 09:19:07

标签: c file fwrite

我已阅读所有来源,并试图了解为什么此代码提供此类输出,但我无法理解。如果有人能给我具体的答案,请等。

#include<stdio.h>

int main()
{
    FILE *fp1;
    FILE *fp2;

    fp1=fopen("abc","w");
    fp2=fopen("abc","w");

    fwrite("BASIC",1,5,fp1);
    fwrite("BBBBB CONCEPTS",1,14,fp2);

    return 0;
}

当我打开文件“abc”时,输出是BASIC CONCEPTS。 为什么第二个fwrite没有覆盖文件“abc”的内容? 预期的产出应该是BBBBB CONCEPTS

2 个答案:

答案 0 :(得分:3)

问题是,您正在使用缓冲的fwrite()而不是未缓冲的write()。后者告诉内核:“将这些内容写入文件 now ”,第一个告诉标准C库“只要你认为合适就把这些东西写到文件中”。显然,标准C库实现首先从fp2刷新了内容,然后用fp1中的内容覆盖它。

当然,您可以通过自己调用fflush()和/或实际关闭文件来强制执行正确的刷新顺序。

答案 1 :(得分:1)

正如cmaster所说,fopen创建了一个缓冲的文件流。缓冲流只会在通过fflush明确告知或缓冲区已满时(通常为4096字节左右)刷新其数据。您写入缓冲流的少量数据不会导致数据刷新到磁盘。

如果程序terminates当仍有缓冲流打开时,libc(实现缓冲流)automatically将从最近打开的流开始,在GNU LibC中刷新流。正如cmaster正确指出的那样,C标准没有指定文件关闭的顺序,只是它们must被关闭。