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语言文件IO操作

函数原型: size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );       所在头文件 :  Read blo...

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

环境:vs2013 语言:C语言 时间:2015年3月10日 #define _CRT_SECURE_NO_WARNINGS #include #include #define FILENAME...

C函数中的二进制I/O

一.前言把数据写到文件效率最高的方法是用二进制形式写入。二进制输出避免了在数值转换为字符串过程中所涉及的开销和精度损失。但二进制数据并非人眼所能阅读。所以该方法只有当数据被另一个程序按顺序读取时才能使...
  • tigerjb
  • tigerjb
  • 2012年02月09日 20:05
  • 1770

C语言标准I/O函数及其特点总结

C语言的标准I/O库通过系统调用同内核打交道,内核通过驱动和硬件打交道。由于CPU要处理很多任务,所以和低速的I/O的交互一般要经过中间的缓存。    标准I/O库有几个常用函数,虽然很常见,但是其...

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

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

调用 fork 两次避免僵尸进程

Avoid zombie processes by calling fork twice /* * Avoid zombie processes by calling fork twice. *...

在Windows中实现sudo命令——命令行环境中获取管理员权限

Windows系统从 Vista 版本开始加入了 UAC 机制,这导致没有足够权限的程序无法获取到一些关键资源。在 Linux 下我们可以使用 sudo 命令方便地提升当前程序的执行权限,但在 ...

Linux下用C语言fopen、fread和fwrite函数对二进制文件的操作

一、前言在做一个镜头的初始化操作,需要加载一个648*522像素大小的文件,厂商提供的是一个excel表,如果要加载数据,可用加载txt文本的方式,我选用二进制方式加载文件;大家都知道电脑真正执行的不...
  • psy6653
  • psy6653
  • 2017年03月14日 09:50
  • 350

C语言中的二进制I/O:fread、fwrite

二进制文件I/O fread fwrite
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言的二进制IO函数fread()和fwrite()
举报原因:
原因补充:

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