关于fwrite跟fprintf函数的区别

电信用户 2010-04-26 01:42:58
书上说,用fprintf和fscanf函数对磁盘文件进行读写,在输入时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花费时间多,在内存与磁盘频繁交换数据的情况下,最好不用fprintf和fscanf函数,而用fread和fwrite函数。

比如fwrite跟fprintf,都是将数据写入磁盘;
fprintf也是将数据存储到磁盘,在输入时要将ascii转换成二进制。
fwrite是将内存中的数据写到磁盘,内存中是数据不是二进制的吗?不是输入到内存就为二进制了么?
这样下来还不都是一样的,哪里有快慢之分啊?

不理解了。。。大侠求教!
...全文
1163 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
感觉还是没将清楚。。。
新加坡下雨了 2011-05-25
  • 打赏
  • 举报
回复
受教了
匚匚 2010-04-26
  • 打赏
  • 举报
回复
嗯,这个好
[Quote=引用 10 楼 zhao4zhong1 的回复:]
《计算机组成原理》
比如
int v=1;
fwrite(&v,sizeof(int),1,f);//文件中被写四个字节0x01 0x00 0x00 0x00(32位int,小端存储)
fprintf(f,"%d",v);//文件中被写一个字节0x31(即'1'的ASCII码)
又比如
int v=0x12345678;
fwrite(&v,sizeof(int),1……
[/Quote]
赵4老师 2010-04-26
  • 打赏
  • 举报
回复
《计算机组成原理》
比如
int v=1;
fwrite(&v,sizeof(int),1,f);//文件中被写四个字节0x01 0x00 0x00 0x00(32位int,小端存储)
fprintf(f,"%d",v);//文件中被写一个字节0x31(即'1'的ASCII码)
又比如
int v=0x12345678;
fwrite(&v,sizeof(int),1,f);//文件中被写四个字节0x78 0x56 0x34 0x12(32位int,小端存储)
fprintf(f,"%x",v);//文件中被写八个字节0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38
fprintf(f,"%d",v);//文件中被写九个字节0x33 0x30 0x35 0x34 0x31 0x39 0x38 0x39 0x36
(因为0x12345678==305419896)
zhangweiit 2010-04-26
  • 打赏
  • 举报
回复
把所有字符内容得到后,再一次性fwrite,减少磁盘读写
zhangweiit 2010-04-26
  • 打赏
  • 举报
回复
这个理解有点乱
无论什么时候,在内存中的东西,只能是二进制的啊
这不是我们要在意的,我们要在意的是fwrite传什么参数,fprintf又传什么参数
fwrite传的是buffer,是一个地址,直接COPY内存这一段的数据
而fprintf只是传一段字符,因为需要格式后,然后再转换为二进制
fprintf多了一层转换
但最终都是二进制

还有一种做法,又可以轻松转换,又可以提升性能,就是,你先用sprintf得到字符,再fwrite
CCPP_Rookie 2010-04-26
  • 打赏
  • 举报
回复
所谓二进制输出,就是直接根据你给的参数,从给定的内存起始地址开始把后面相应大小的内存直接原封不动写到文件里,我觉得跟memcpy差不多,只不过目标从变成了磁盘。

int n = 1;
fwrite(&n, sizeof(int), 1, pFile);

文件里就会写上 01 00 00 00 (文件结束),用记事本打开的话就是“乱码”。
cattycat 2010-04-26
  • 打赏
  • 举报
回复
fwrite 是二进制输出,fprintf是按人可读的格式输出,跟控制台下的printf差不多。
kingstarer 2010-04-26
  • 打赏
  • 举报
回复
例如int i = 1;
如果用fwriite则直接将i的二进制数据输出即可
如果是fprintf("%d", i);则需要先将i转换成'1' (字符1)
再输出'1'的二进制数据
向立天 2010-04-26
  • 打赏
  • 举报
回复
是这个意思
比如你要存int n=1;
用fprintf你实际上存的是字符串"1"
而用fwrite你存的就是整型数n
elegant87 2010-04-26
  • 打赏
  • 举报
回复
你可以跟scanf和printf这两个函数比较,需要带格式的。带f的表示像磁盘文件操作
电信用户 2010-04-26
  • 打赏
  • 举报
回复
就是在输入到屏幕的时候 数据的存储方式我不明白
toryhector 2010-04-26
  • 打赏
  • 举报
回复
fprintf,是带格式的吧!

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧