C语言的二进制IO函数fread()和fwrite()

原创 2017年06月13日 23:40:35

C语言的二进制IO函数fread()和fwrite()



图片来源-百度图片

之前的fprintf()、fscanf()、fgets()和fputs()等标准I/O都是面向文本的,用于处理字符和字符串。

例如,下面的代码:

double num=1./3;
fprintf(fp,"%f",num);

把num存储为8个字符;0.333333。使用%0.2f转换说明将其存储为4个字符:0.33,用%0.2f转换说明将其存储为14个字符:0.33333333333。改变转换说明将改变存储该值所需的空间数量,也会导致存储不同的值。把num存储为0.33后,读取文件就无法将其恢复为更高的精度。一般而言,fprintf()把数值转换为字符数据,这种转换可能会改变值。

为保证数值存储前后一致,最精确的做法是使用与计算机相同的位组合来存储。因此,double类型的值,应该存储在一个double大小的单元中。如果以程序所用的表示法把数据储存在文件中,则称为二进制形式储存数据。不存在从数值形式到字符串的转换过程。对于标准I/O,fread()和fwrite()函数用于二进制形式处理数据(如下图所示)。

实际上所有的数据都是以二进制形式储存的,甚至连字符都以字符码的二进制表示来储存。如果文件中的所有数据都被解释成字符码,则称为该文件包含文本数据。如果大部分或所有数据被解释成二进制形式的数值数据,则称该文件包含二进制数据(另外,用数据表示机器语言指令的文件都是二进制文件)。

二进制和文本的用法很容易混淆。ANSI C和许多操作系统都同时识别这两种文件格式,能以二进制数据或文本数据形式存储或读取信息。可以用二进制模式打开文本格式的文件,可以把文本储存在二进制形式的文件中。可以调用getc()拷贝包含二进制数据的文件。然而,一般而言,用二进制模式在二进制格式中存储二进制数据。类似地,最常用的还是以文本格式打开文本文件中的文本数据(通常文字处理器生产的文件都是二进制文件,因为这些文件中包含了大量的非文本信息,如字体和格式等)。

fread()和fwrite()函数的用法

头文件:#include <stdio.h>

fread()函数用于从文件流中读取数据,其原型为:
size_t fread(void *buffer, size_t size, size_t count, FILE * stream);

【参数】buffer为接收数据的地址,size为一个单元的大小,count为单元个数,stream为文件流。

fread()函数每次从stream中最多读取count个单元,每个单元大小为size个字节,将读取的数据放到buffer;文件流的位置指针后移 size * count 字节。

【返回值】返回实际读取的单元个数。如果小于count,则可能文件结束或读取出错;可以用ferror()检测是否读取出错,用feof()函数检测是否到达文件结尾。如果size或count为0,则返回0。

与fread()相对应的函数为fwrite(),fread() 和 fwrite() 一般用于二进制文件的输入输出,ASCII文件还是不要考虑了。

头文件:#include <stdio.h>

fwrite()函数以二进制方式向文件流中写入数据,其原型为:
size_t fwrite(void * buffer, size_t size, size_t count, FILE * stream);

【参数】buffer为数据源地址,size为每个单元的字节数,count为单元个数,stream为文件流指针。

fwrite()函数每次向stream中写入count个单元,每个单元大小为size个字节;文件流的位置指针后移 size * count 字节。

【返回值】返回成功写入的单元个数。如果小于count,则说明发生了错误,文件流错误标志位将被设置,随后可以通过ferror()函数判断。

如果 size 或 count 的值为 0,则返回值为 0,并且文件流的位置指针保持不变。

与fwrite()相对应的函数为fread(),fread() 和 fwrite() 一般用于二进制文件的输入输出。


参考文献:

[1] 史蒂芬・普拉达. C Primer Plus (第6版) 中文版[M]. 人民邮电出版社, 2016.

[2] C语言fread()函数:从文件流中读取数据.-来源

[3] C语言fwrite()函数:向文件流中写入数据-来源

版权声明:本文为博主原创文章,转载请注明出处libing403的csdn博客http://blog.csdn.net/libing403?viewmode=contents

二进制数与十进制数相互转换的C代码(C语言/C程序)

二进制数(数组)转换成十进制数的函数:BtoO(char str[]){int lg,sum=0,j=1;lg=strlen(str)-1;for(;lg>=0;lg--){sum=sum+(str[...
  • huangyiyun
  • huangyiyun
  • 2007年11月30日 23:31
  • 14616

关于二进制文件fread、fwrite函数使用读写

环境:vs2013 语言:C语言 时间:2015年3月10日 #define _CRT_SECURE_NO_WARNINGS #include #include #define FILENAME...
  • Mingyueruya
  • Mingyueruya
  • 2015年03月10日 22:05
  • 2029

fopen()、fwrite()、fread()函数使用说明与示例

fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针。 2.函数原型: FILE * fopen(const char * path,const ...
  • yang2011079080010
  • yang2011079080010
  • 2016年09月13日 18:21
  • 30514

C语言fwrite函数了解

fwrite()函数----write data to a stream 原型: size_t fwrite(const void* buffer, size_t size, size_t c...
  • hgj125073
  • hgj125073
  • 2012年12月12日 17:25
  • 15339

关于二进制文件fread、fwrite函数使用读写

环境:vs2013 语言:C语言 时间:2015年3月10日 #define _CRT_SECURE_NO_WARNINGS #include #include #define FILENAME...
  • Mingyueruya
  • Mingyueruya
  • 2015年03月10日 22:05
  • 2029

fwrite和fread函数的用法小结(怎么样以二进制形式保存和读取文件)

fwrite和fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出。 [cpp] view plaincopyprint? ...
  • kaka_36
  • kaka_36
  • 2014年11月14日 16:37
  • 5630

C语言: fwrite和fread函数的用法小结 (网上摘抄,方便以后查询)

转自:http://purpleroom.blog.sohu.com/133812394.html fwrite和fread是以记录为单位的I/O函数,fread和fwrite函...
  • Curly_Chen
  • Curly_Chen
  • 2016年06月08日 09:29
  • 1921

C语言函数fread() , fwrite() ,fseek()用法分析

网上已经有不少关于c语言函数fread() 和fwrite() 用法分析的文章,在此将这两个函数的用法写下来,是为了巩固所学,加深印象,也为了日后方便查询复习比较,如果能帮助到某些朋友,则是意外的惊喜...
  • linpengbin
  • linpengbin
  • 2015年02月02日 15:55
  • 3716

fopen()、fwrite()、fread()函数使用说明与示例

fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针。 2.函数原型: FILE * fopen(const char * path,const ...
  • yang2011079080010
  • yang2011079080010
  • 2016年09月13日 18:21
  • 30514

linux c之用fwrite和fread实现文件的复制

1、题目       用fwrite和fread函数实现文件的复制 2、函数解释      #include size_t fread(void *ptr, size_t size, size_t ...
  • u011068702
  • u011068702
  • 2017年01月11日 15:29
  • 2742
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言的二进制IO函数fread()和fwrite()
举报原因:
原因补充:

(最多只允许输入30个字)