关于将数据写入文件的两个函数fwrite()与fprintf()的大不同 —————— 开开开山怪

fwrite()与fprintf()的大不同

1.用法

 fwrite(void *buffer, sizeof(数据类型), 数据类型的数量, FILE *file);
 fprintf(FILE *file, 格式符, data);

2.fwrite()函数的详解

重中之重:fwrite()写的是内存印象图

fwrite()函数在进行数据写入文件的时候,其本质是在写内存印象图,将数据写入内存中的缓存,之后再经过操作系统将进行数据与文件之间的操作,此时数据存储在文件的形式(文件的主体)其实就是逻辑层面的内存印象图,数据在文件中存储的首地址也是相对首地址(而非物理地址)。

那么是写内存印象图,就有一定的规则,比如内存对齐模式,以及数字写入时遵循高高低低的原则,那么对于内存对其模式,简单来说就是,一个数据写入内存中的缓存,要遵循内存对其模式,如果说写入一个int类型的数据,那么这个数据的物理首地址一定是4的倍数,写入一个double类型的数据,那么这个数据在内存中的物理量首地址一定是8的倍数,经过操作系统对内存中的数据进行处理,这个数据在文件中存储(即二进制层面)呈现的逻辑地址(就是在文件中存储的首地址,也称相对首地址)一定是这个数据的类型的字节倍数,虽然会浪费一定的空间,但是就内存的页式管理方面,减少了在读取数据的时候,对内存的访问次数。但是这里说到文件属于外存的范畴,所以当我们采用fwrite()函数进行将数据写入文件的时候大可在代码的开头加上pragram pack(1),这个意思就是不再采用内存对其模式进行写入数据,在内存中的物理地址是接连存储的,不再像之前为了对齐而有空间的浪费,那么这些数据所存储在文件中的相对首地址接着前一个数据之后进行存储,极大的减少了空间的浪费,fwrite()对数据的处理和fprintf()函数的不同之处是,不管多大的数字只要在21亿范围之内,都将只占用四个字节,意思就是将这个数据转化为二进制,再根据内存的存储规则高高低低原则进行将数据存储到文件。

3.fprintf()函数的详解

重中之重:fprintf()写的是ASCII

fprintf()函数在进行数据写入文件的时候,其本质将数据的ASCII写进文件,不管是对于字符串还是数字来说,例如34568,采用fprintf()函数进行写入文件时,就会将这个数据的ASCII值写入文件,这个数据有多少位,就会占用多少个字节,34568写入内存的样子就是33 34 35 36 38(这里的33是3的ASCII值)

4.fwrite 与 fprintf的区别

1.在对字符与字符串处理上没有区别,
2.在对数字上,区别在于fwrite()将数据的二进制形式写入文件,而fprintf()是将ASCII值写入文件
3.在内存角度来看,fwrite()在不使用pragram pack(1)时候,写入文件是按照内存对其模式来进行存储的,为了进行对齐,会有空间的浪费,若使用pragram pack(1)则不会有空间的浪费,而fprintf()是紧跟上一个数据其后进行存储,没有空间的浪费。

5.将数据写入文件到底用哪个函数更好

必选fwrite(),因为好处太多

1.采用fwrite()进行写入数据,此时就要在代码的最开头加上pragram pack(1),保证不浪费空间,还能保证在读取的时候根据在文件中所占用的字节数进行定位读取,如果要进行读取文件内的信息,则可以直接用fseek()函数进行定位读取,而不用从头至尾挨个读取。
2.相较于fprintf()来还有一个好处就是,因为fprintf()进行写的时候,对应的应该采用fscanf()函数取相关的信息,但是fscanf()是采用格式符的形式进行读取,那就要求我们在写入的时候还要在每个数据之后再写一个空白字符进行将数据独立,这样fscanf()在读取的时候遇到空白字符就结束读取才能正确读取相关的信息,那么在写的时候就得使用大量的空间去写空白字符,这是我们所不想要的,自然用fwrite()函数就很方便,因为采用fread()函数进行读取,是根据字节数来进行读取,准确又方便也不用担心会遇到空白字符而结束读取,fread()函数直到读到文件的末尾才结束读取。
3.采用fwrite()函数时,会有很多辅助函数帮助你获取你想要的信息,例如ftell()函数可以得到当前位指针位置相对于文件首部的偏移量,fseek()可通过文件指针的定位读取相关的信息。

温馨提示:

采用fwrite()函数进行写的时候,最佳之选采用fread()函数进行读取;
采用fprintf()函数进行写的时候,最佳之选采用fscnaf()函数读取;
因为上边已经说了fwrite 与 fpritnf 在写入时候的区别,如果混用,会出现读出的数据与写入的数据有所出入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值