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

来源:互联网 发布:d3.v3.min.js引用 编辑:程序博客网 时间:2024/05/01 15:14

本文针对在工作中遇到的问题,并结合网上的资料作了总结,希望对各位有用。


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



0 0
原创粉丝点击