2013-09-28 21 views
4

我已阅读所有的来源,我试图理解为什么这段代码给这种输出,但我不明白。请如果有人能给我具体的答案....在同一个文件上的两个连续的fwrites

#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”输出是基本概念。 为什么第二个fwrite不会覆盖文件“abc”的内容? 预期的输出应该是BBBBB概念

+2

尝试添加(缺少的调用)'fclose()'到代码中的各种组合,看看会发生什么。 – alk

+0

您正在使用哪种编译器? MSVC会生成您期望的输出。 – simonc

回答

3

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

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

+0

对我而言,更有趣的问题是为什么在刷新内容时使用此特定顺序。 –

+0

@GearoidMurphy该特定顺序将依赖于实现,afaik在C标准中对此没有任何保证。它基本上归结为清理代码中的循环是从前到后还是从后到前工作的问题,而这完全取决于程序员... – cmaster

+0

@cmaster:谢谢,我现在明白了.. –

1

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

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

+0

谢谢你解释很好。 –

相关问题