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