fwrite ,fprintf的作用与区别

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;

}

  

打开是:

image

示例二:

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;

}

  

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

image

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

 

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;

}

  

打开生成的文件是:

image

示例四:

若是稍微修改一下上述代码,改成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;

}

  

文件打开就是:

image

 

3. 区别

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

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

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

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

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

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

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

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值