1. fwrite函数基础解析
fwrite是C语言标准库中用于二进制数据写入的核心函数,它直接操作文件流,比文本模式写入更底层高效。这个看似简单的函数背后,隐藏着许多开发者容易忽略的细节陷阱。
函数原型如下:
c复制size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
参数解析:
ptr:指向要写入数据的内存地址,可以是任何数据类型指针size:单个数据项的字节大小,通常用sizeof运算符获取nmemb:要写入的数据项数量stream:目标文件流指针
返回值是实际成功写入的数据项数量(不是字节数!),这个细节经常被误解。当返回值小于nmemb时,意味着发生了写入错误或到达文件末尾。
关键陷阱:size和nmemb参数的实际意义经常被混淆。比如要写入100字节数据,可以设置size=1,nmemb=100,也可以size=100,nmemb=1,两者效果相同但语义完全不同。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 二进制写入的底层机制
2.1 内存到文件的直接映射
fwrite实现的是内存块到文件的直接二进制拷贝,不进行任何数据转换。这与文本模式的fprintf有本质区别:
- 整数1234用fwrite写入时是4字节的二进制表示0x000004D2
- 用fprintf写入则是'1','2','3','4'四个ASCII字符
c复制int num = 1234;
// 二进制写入
fwrite(&num, sizeof(num), 1, file);
// 文本写入
fprintf(file, "%d", num);
2.2 缓冲区工作机制
fwrite并不立即将数据写入磁盘,而是先存入stdio缓冲区。缓冲区的三种模式影响写入行为:
- 全缓冲(_IOFBF):默认模式,缓冲区满时写入
- 行缓冲(_IOLBF):遇到换行符时写入
- 无缓冲(_IONBF):立即写入
可通过setvbuf函数控制缓冲模式:
c复制char buf[BUFSIZ];
setvbuf(file, buf, _IOFBF, BUFSIZ);
重要经验:在关键数据写入后,应立即fflush
