我已阅读所有来源,并试图了解为什么此代码提供此类输出,但我无法理解。如果有人能给我具体的答案,请等。
#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
答案 0 :(得分:3)
问题是,您正在使用缓冲的fwrite()
而不是未缓冲的write()
。后者告诉内核:“将这些内容写入文件 now ”,第一个告诉标准C库“只要你认为合适就把这些东西写到文件中”。显然,标准C库实现首先从fp2
刷新了内容,然后用fp1
中的内容覆盖它。
当然,您可以通过自己调用fflush()
和/或实际关闭文件来强制执行正确的刷新顺序。
答案 1 :(得分:1)
正如cmaster所说,fopen
创建了一个缓冲的文件流。缓冲流只会在通过fflush
明确告知或缓冲区已满时(通常为4096字节左右)刷新其数据。您写入缓冲流的少量数据不会导致数据刷新到磁盘。
如果程序terminates当仍有缓冲流打开时,libc(实现缓冲流)automatically将从最近打开的流开始,在GNU LibC中刷新流。正如cmaster正确指出的那样,C标准没有指定文件关闭的顺序,只是它们must被关闭。