4

我已经阅读了所有资料,并试图理解为什么这段代码会给出这样的输出,但我无法理解。如果有人可以给我具体的答案,请......

#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 概念

4

2 回答 2

3

问题是,您使用的是 bufferedfwrite()而不是 unbuffered write()后者告诉内核:“现在将这些东西写入文件”,第一个告诉标准 C 库“只要你认为合适就将这些东西写入文件”。显然,标准 C 库实现fp2首先刷新了内容,然后用fp1.

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

于 2013-09-28T09:44:21.680 回答
1

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

If the program terminates when there are still buffered streams open, libc (which implements the buffered stream) automatically flushes the streams, starting from the most recently opened stream, in GNU LibC anyway. As cmaster correctly points out, the order in which the files are closed is not specified by the C standard, only that they must be closed.

于 2013-09-28T10:07:40.827 回答