scanf和fpintf是一对,用fprintf写的必须用fscanf来读。

fread和fwrite是一对,用fwrite写的必须用fread来读。

同样的数据,使用fprintf和fwrite写下去的是不一样的,但是使用其相应的读命令读上来的数据会是一样的。

fwrite是将数据不经转换直接以二进制的形式写入文件,而fprintf是将数据转换为字符后再写入文件。

文件格式:文本文件(ASCII文件)和二进制文件。我们平时能够用记事本看的文件就是文本文件。‘

文本文件使用fscanf格式读取。二进制文件用fread读取。

C语言把文件看作一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据数据的组织形式,可分为ASCII文件和二进制文件。ASCII文件又称为文本(text)文件,它的每个字节放一个ASCII代码,代表一个字符。二进制文件是把内存中的数据按其在内在中的存储形式原样输出到磁盘上存放。

fprintf(fp, "%d", buffer); 是将格式化的数据写入文件
fprintf(文件指针,格式字符串,输出表列);

fwrite(&buffer, sizeof(int), 1, fp);是以二进位方式写入文件
fwrite(数据,数据类型大小(字节数),写入数据的最大数量,文件指针);

由于fprintf写入时,对于整数来说,一位占一个字节,比如1,占1个字节;10,占2个字节;100,占3个字节,10000,占5个字节
所以文件的大小会随数据的大小而改变,对大数据空间占用很大。
而fwrite是按二进制写入,所以写入数据所占空间是根据数据类型来确定,比如int的大小为4个字节(一般32位下),那么整数10所占空间为4个字节,100、10000所占空间也是4个字节。所以二进制写入比格式化写入更省空间。

因此,
对于1 2 3 4 5 6 7 8 9 0 十个整数,用fprintf写入时,占10个字节;而用fwrite写入时,占40个字节。
对于100 101 102 103 104 105 106 107 108 109 110 这十个整数,用fprintf写入时,占30个字节;而用fwrite写入时,占40个字节。
对于10000 10100 10200 10300 10400 10500 10600 10700 10800 10900 11000 这十个整数,用fprintf写入时,占50个字节;而用fwrite写入时,还是占40个字节。

fwrite 函数按照指定的数据类型将矩阵中的元素写入到文件中。写二进制文件
其调用格式为:COUNT=fwrite (fid, A, precision)其中COUNT返回所写的数据元素个数,fid为文件句柄,A用来存放写入文件的数据,precision用于控制所写数据的类型,其形式与fread函数相同。
fprintf 写文本文件 函数的调用格式为:COUNT= fprintf(fid, format, A)其中A存放要写入文件的数据。先按format指定的格式将数据矩阵A格式化,然后写入到fid所指定的文件。format用以控制读取的数据格式,由%加上格式符组成,常见的格式符有d,f,c,s。fid为文件句柄。

2.用法

2.1 fwrite 函数

示例一:

1

2

3

4

5

6

7

8

9

10

11

12

/* fwrite example: write buffer */

#include "stdafx.h"

#include <stdio.h>

int main(int argc, char* argv[])

{    FILE * pFile;

    char buffer[] = { 'x' , 'y' , 'z' };

    pFile = fopen ("D://myfile.txt", "wb");

    fwrite (buffer , sizeof(char), sizeof(buffer), pFile);

    fclose (pFile);

    return 0;

}

  

打开是:

示例二:

1

2

3

4

5

6

7

8

9

10

11

12

13

/* fwrite example: write buffer */

#include "stdafx.h"

#include <stdio.h>

int main(int argc, char* argv[])

{    FILE * pFile;

    int buffer[] = { 64,66,78 };

    pFile = fopen ("D://myfile.txt", "wb");

    fwrite (buffer , sizeof(int), sizeof(buffer), pFile);

    fclose (pFile);

    return 0;

}

  

执行后生成的文件,打开是:

那么,问题就来了,为什么示例一生成的文件没有乱码,示例二的打开就乱码了呢?请看区别

2.2 fprintf 函数

示例三:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

/* fprintf example */

#include "stdafx.h"

#include <stdio.h>

int main(int argc, char* argv[])

{    FILE * pFile;

int n;

char name [100];

pFile = fopen ("D://myfile1.txt","w");

for (n=0 ; n<3 ; n++)

{

    puts ("please, enter a name: ");

    gets (name);

    fprintf (pFile, "Name %d [%-10.10s]\n",n,name);

}

fclose (pFile);

    return 0;

}

  

打开生成的文件是:

示例四:

若是稍微修改一下上述代码,改成fwrite,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/* fprintf example */

#include "stdafx.h"

#include <stdio.h>

int main(int argc, char* argv[])

{    FILE * pFile;

int n;

char name [100];

pFile = fopen ("D://myfile.txt","w");

for (n=0 ; n<3 ; n++)

{

    puts ("please, enter a name: ");

    gets (name);

    //fprintf (pFile, "Name %d [%-10.10s]\n",n,name);

    fwrite (name , sizeof(char), sizeof(name), pFile);//修改此处

}

fclose (pFile);

    return 0;

}

  

文件打开就是:

3. 区别

问题一:示例一和示例二,为什么一个是可读的,一个是乱码呢?

答:用fwrite 写入文件的如果是能够表示为字符,那么就会显示为字符,如果显示不出来,那就写的是二进制内容(所谓的乱码)

问题二:示例三和是四,为什么一个可读,一个是乱码?

答:fprintf写的是数字转换成ASCII码之后的字符。

用记事本打开看下,fwrite写的打开是乱码,fprintf写入的是可读的字符

其实这四个示例生成的文件用fopen都是可读的,四个文件都没有错

总而言之:如果要让生成的文件自己可以看得懂,那么就选择fprintf,如果想看不懂,那就用fwrite,两者只是写入方式不同,生成的文件倒都是计算机可读的

fwrite ,fprintf的作用与区别相关推荐

  1. Spring中SmartLifecycle和Lifecycle的作用和区别

    欢迎关注方志朋的博客,回复"666"获面试宝典 本文基于SpringBoot 2.5.0-M2讲解Spring中Lifecycle和SmartLifecycle的作用和区别,以及如 ...

  2. ANDROID 中UID与PID的作用与区别

    ANDROID 中UID与PID的作用与区别 PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统 ...

  3. (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...

  4. python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用

    python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用(3-20181205) 文章目录: 一. @staticmetho ...

  5. Jar/War/Ear等包的作用与区别详解

    Jar/War/Ear等包的作用与区别详解 以客户角度来看,jar文件就是一种封装格式,用户不需要知道jar包中有多少个.class格式的文件及每个文件中的功能与作用,也可以得到相应的访问的结果.ja ...

  6. java ear war_[转] 基于Java的打包jar、war、ear包的作用与区别详解

    以最终客户的角度来看,JAR文件就是一种封装,他们不需要知道jar文件中有多少个.class文件,每个文件中的功能与作用,同样可以得到他们希望的结果.除jar以外对于J2EE来说还有war和ear.区 ...

  7. linux中export和source的作用和区别

    linux中export和source的作用和区别 2013-11-12 12:36 1039人阅读 评论(0) 收藏 举报 分类: linux(82) shell与export命令 用户登录到Lin ...

  8. Cookie和Session的作用,区别和各自的应用范围,Session工作原理

    Cookie和Session的作用与区别 Session用于保存每个用户的专用信息. 每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) . 她的生存期是用户持续请 ...

  9. 工业级光纤收发器与光端机各自的作用及区别介绍

    工业通信行业的朋友应该都知道,光端机和光纤收发器都是一种可以进行光电转换的通信设备,它们之间有很多类似的功能.既然这样,那它们能否通用呢?接下来,就由飞畅科技的小编来给大家解释说明下光纤收发器和光端机 ...

最新文章

  1. FastDFS蛋疼的集群和负载均衡(十五)之lvs四层+Nginx七层负载均衡
  2. 网易云音乐刷听歌量_榆林网易云音乐粉丝量主要方式
  3. easy ui example
  4. 实现工控机4U断电后自动重启功能
  5. 在 TreeView 控件中显示分层数据
  6. ffmpeg的编译大全
  7. Android public class MyApplication extends MultiDexApplication使用
  8. C语言字符5,c语言总览5:字符输入和输出
  9. T410s主板上的黑色塑料是散热问题的祸首
  10. 计算机应用数学,计算机应用数学.PDF
  11. 模拟大规模电动车充电行为(Matlab实现)
  12. html5头部区域标签,HTML5语义标签(header、section、footer)
  13. svn 报 系统找不到指定路径
  14. 亮度,饱和度,对比度的计算方法
  15. 集成框架 -- 快手接入
  16. linux 下的字体引擎
  17. DailyFi - 9.23|Dapper Labs 完成2.5亿美元融资,Vera 在 Polkastarter 上启动IDO
  18. 【对比Java学Kotlin】object 关键字
  19. w ndows7手写,Windows7使用教程之Tablet PC手写输入
  20. 程序员之“盲人摸太阳”

热门文章

  1. RT-Thread逐飞-智能车培训之MM32芯片应用
  2. 第九届全国大学生智能汽车竞赛获奖名单
  3. 有些原理,讲着讲着自己也就相信了
  4. 使用深度置信网络进行特征提取代码实现 python_2019必学的10大顶级Python库
  5. 什么是方向图乘积定理_课本上没有,但十分好用的初中数学定理公式
  6. android如何暂停倒计时,在Android中暂停和恢复倒计时器和进度条?
  7. ios 百度地图指定区域_iOS开发(第三方使用)——百度地图的简单使用(定位与当前位置的显示)...
  8. r - 求平均成绩_2019深圳市公务员考试笔试成绩公布!
  9. micropython比c_选择C/C++还是选择MicroPython来开发?(第0章-第三节)
  10. 【FPGA】ROM/EPROM的设计(使用加载文件的方式初始化)