Fwrite和fprintf之间的区别(总结)

本文深入对比了fwrite与fprintf两个文件写入函数的功能、使用场景及区别。详细解析了fwrite以二进制形式写入文件,适合大数据量且节省空间的特点,以及fprintf用于格式化数据写入文本文件的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近,在工作中,要做一个关键日志保存工具。在开发过程中,使用了函数fwrite写入到文本文件中,但是当用UE打开以后,却总是以十六进制的形式显示,
即使进行转换,文本文件中,仍然有很多乱码,但是使用函数fprintf写入却不会出现上面的问题。
一、 fwrite函数介绍

size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
功能:向文件写入一个数据块(以二进制形式对文件进行操作,不局限于文本文件)
返回值:返回实际写入的数据块数目
参数说明:
1. buffer:要获取数据的地址;
2. size:要写入内容的单字节数;
3. count:要进行写入size字节的数据项的个数;
4. stream:目标文件指针;
注意:fwrite函数写到用户空间缓冲区,并未同步到文件中,所以修改后要将内存与文件同步可以用fflush(FILE *fp)函数同步


#include <stdio.h> struct mystruct{        int i;        char c;}; int main(void){        FILE *stream;        struct mystruct s;        if((stream = fopen("./test.tmp", "wb")) == NULL)        {                fprintf(stderr, "cannot open output file.\n");                return 1;        }        s.i = 2;        s.c = 'A';        fwrite(&s, sizeof(s), 1, stream); //写mystruct到文件中        fclose(stream); //关闭文件         return 0;} 结果:[root@f8s fwrite_test]# cat test.tmp �A/oot@f8s fwrite_test]# [root@f8s fwrite_test]# vim test.tmp ^B^@^@^@A/<87>^@二、 fprintf函数介绍 


#include <stdio.h>
int fprintf( FILE *stream, const char *format, ... );
功能:根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件
返回值:若成功则返回输出字符数,若输出出错则返回负值。

 

#include <stdio.h>#include <stdlib.h> FILE * stream;int main(void){        int i = 10;        double fp = 1.5;        char s[] = " this is a string";        char c = '\n';        stream = fopen("./fprintf.out","w");        fprintf(stream, "%s%c", s, c);        fprintf(stream, "%d\n", i);        fprintf(stream, "%f\n", fp);        fclose(stream);        return 0;}结果:[root@f8s fprintf_test]# gcc fprintf_test.c -o fprintf_test[root@f8s fprintf_test]# ./fprintf_test                    [root@f8s fprintf_test]# cat fprintf.out  this is a string101.500000[root@f8s fprintf_test]#
三、 fwrite与fprintf的区别


1. fprintf(fp, "%d", buffer); 是将格式化的数据写入文件
   fwrite(&buffer, sizeof(int),1, fp);是以二进位方式写入文件
2. fprintf写文本文件,用记事本可以打开查看
   fwrite写二进制文件
3. fprintf写入时,对于整数来说,一位占一个字节,比如1,占1个字节;10,占2个字节;
所以文件的大小会随数据的大小而改变,对大数据空间占用很大。
fwrite是按二进制写入,写入数据所占空间是根据数据类型来确定,所以二进制写入比格式化写入更省空间

下面针对第三点,举例说明:
*  对于1 2 3 4 5 ,五个整数,用fprintf写入时,占5个字节;而用fwrite写入时,占20个字节。

#include <stdio.h>#include <string.h> int main(void){        FILE *fp = NULL;        FILE *fw = NULL;        int i = 0;         fp = fopen("./fp.txt", "w");        fw = fopen("./fw.txt", "w");         for(i = 1; i < 6; i++)        {                fprintf(fp, "%d", i);        }                for(i = 1; i < 6; i++)        {                fwrite(&i, sizeof(i), 1, fw);        }         return 0; } 结果:[root@f8s fwrite_fprintf]# ls -l *.txt-rw-r--r-- 1 root root  5 2014-02-11 14:36 fp.txt-rw-r--r-- 1 root root 20 2014-02-11 14:36 fw.txt[root@f8s fwrite_fprintf]# 
* 对于10000 20000 30000 40000 50000,这五个整数,用fprintf写入时,占25个字节;而用fwrite写入时,还是占20个字节。
#include <stdio.h>#include <string.h> int main(void){        FILE *fp = NULL;        FILE *fw = NULL;        int i = 0;         fp = fopen("./fp.txt", "w");        fw = fopen("./fw.txt", "w");         for(i = 10000; i < 60000; )        {                fprintf(fp, "%d", i);                i = i + 10000;        }         for(i = 10000; i < 60000; i++)        {                fwrite(&i, sizeof(i), 1, fw);                i = i + 10000;        }         return 0; }结果:[root@f8s fwrite_fprintf]# ls -l *.txt-rw-r--r-- 1 root root 25 2014-02-11 14:41 fp.txt-rw-r--r-- 1 root root 20 2014-02-11 14:41 fw.txt[root@f8s fwrite_fprintf]#
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值