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

最近,在工作中,要做一个关键日志保存工具。在开发过程中,使用了函数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]#
 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值