fwrite,fflush,你不知道的事!

最近项目代码中遇到很多奇怪的问题,比如,在某个程序中用fwrite向配置文件中写入一些数据,而在另一段代码中需要读取该配置文件中的数据,写文件那段程序已经执行完了,但是数据并没有被写入文件,进而导致读文件的代码读不到数据,程序很难按理想的方式运行。这样下来将会导致一些列的问题,我今天就被这个问题纠结了一下午...

那么这个问题是什么原因导致的呢,该怎么解决呢?

导致问题的原因是 用fwrite函数写数据的时候,fwrite先将数据写到内存中的缓冲区内,
等程序结束后才会将数据由缓冲区写入文件。所以我遇到的问题原因是整个函数还没有运行完毕,写入的数据还在缓冲区内。
解决办法就只有靠fflush()函数了。
#include<stdio.h>

int fflush(FILE *stream)

该函数的作用就是刷新缓冲区

做法是,在写入的数据在函数结束之前就需要的时候,调用fwrite等函数后,紧接着调用fflush()函数将缓冲区刷新,这样数据就会被立刻写入文件而不用等到程序结束(因为之前的数据都在缓冲区里)。


下面通过一个简单的例子让小伙伴们 加深理解:

int main()
{
	FILE *fp = fopen("./file.txt","a");
	if(fp == NULL)
	{
		printf("open file err!\n");
		return -1;
	}
	fwrite("hello",5,1,fp);
	//fflush(fp);
	close(fp);
	
	while(1)
	{
		sleep(5);
	}
	return 0;
}

如上程序,当程序一直不退出的时候,虽然已经调用了fwrite但是数据却在缓冲区里,而并不在文件中,这时你可以查看改路径下的file.txt文件,你会发现文件已经建立但是大小为0,如果你在fwrite之后用fflush函数后数据就会立刻写入文件,我总结就这么多,不喜勿喷,希望对小伙伴们有帮助。


over!



### 使用 `fwrite` 函数的示例 以下是关于如何使用 `fwrite` 函数的一个具体例子。此函数主要用于向二进制文件写入数据,其语法如下: ```c size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); ``` 其中参数解释为: - `ptr`: 要写入的数据指针。 - `size`: 单个元素的大小(单位:字节)。 - `nmemb`: 要写入的元素数量。 - `stream`: 文件流指针。 下面是一个完整的代码示例来展示 `fwrite` 的实际应用[^2]: ```c #include <stdio.h> int main() { // 定义要写入的内容 char str[] = "This is an example of using fwrite."; // 打开文件并设置模式为写 ("w") FILE *fp = fopen("example.txt", "w"); if (fp == NULL) { printf("Error opening file.\n"); return 1; } // 使用 fwrite 将字符串写入到文件中 size_t result = fwrite(str, sizeof(char), sizeof(str) - 1, fp); if (result != sizeof(str) - 1) { printf("File write failed or incomplete.\n"); } else { printf("Data written successfully to the file.\n"); } // 关闭文件 fclose(fp); return 0; } ``` 上述程序的功能是将字符数组 `str` 中的内容写入名为 `example.txt` 的文件中。注意,在计算写入长度时减去 1 是为了排除字符串结束符 `\0`。 另外需要注意的是,虽然 `fwrite` 和其他 I/O 操作可以处理文本文件,但它更适合于 **二进制文件** 的读写操作。对于纯文本文件的操作,推荐优先考虑更简单的函数如 `fprintf` 或者 `fputs` 等[^3]。 ### 注意项 当调用 `fwrite` 后如果立即关闭文件或者希望确保缓冲区中的数据被刷新至磁盘,则应显式调用 `fflush()` 来清空缓冲区。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值