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
- Fwrite和fprintf之间的区别(总结)
- fprintf和fwrite的区别
- fprintf和fwrite的区别
- fwrite与fprintf的区别
- fprintf与fwrite的区别
- fscanf,fread,fprintf,fwrite的区别和联系
- fprintf和fwrite(转载)
- fprintf 与 fwrite 区别
- fprintf和fwrite的一点“怪异”现象
- c语言中的fprintf和fwrite函数区别
- fprintf 与 fwrite 区别很大
- fprintf 与 fwrite 区别很大
- 关于C语言的fprintf与fwrite使用区别
- fprintf()、sprintf()、printf()、fwrite()函数的用法与区别
- 关于C语言的fprintf与fwrite使用区别
- 关于C语言的fprintf与fwrite使用区别
- 关于C语言的fprintf与fwrite使用区别
- fprintf()、sprintf()、printf()、fwrite()函数的用法与区别
- Java异常处理总结
- SQL Profiler的权限管理
- 软件滤波
- Asp.net注入台湾站
- lucene Spring
- Fwrite和fprintf之间的区别(总结)
- 匿名枚举
- 计算机应用基础试题及参考答案
- 职场之路
- LDD3
- easyui 生成树
- 从JAVA客户端访问Redis示例(入门)
- win 7下双击运行jar文件
- 内存重要参数详解