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 https://blog.csdn.net/libing403/article/details/73196536

C中fread()函数的建议使用方法

环境:Vmware Workstation;CentOS-6.4-x86_64 说明: 在使用fread函数的时候,最好使用下面的形式:fread(buf, sizeof(char), siz...
  • sinat_25457161
  • sinat_25457161
  • 2015年09月20日 11:03
  • 7646

C语言fread函数了解

fread()函数---- Reads data from a stream. #include size_t fread( void *buffer, size_t size, size_t ...
  • hgj125073
  • hgj125073
  • 2012年12月13日 10:53
  • 22293

C语言fread()函数:读文件函数(从文件流读取数据)

相关函数:fopen, fwrite, fseek, fscanf 头文件:#include 定义函数:size_t fread(void * ptr, size_t size, siz...
  • sky1203850702
  • sky1203850702
  • 2016年10月10日 15:43
  • 1745

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

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

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
  • 2825

C 语言 fwrite 和 fread 文件读写操作示例

#include int main() { FILE* pFile; float buffer[] = { 2.0 , 3.0 , 8.0 }; pFile = fopen(...
  • hongwenjun
  • hongwenjun
  • 2011年09月29日 13:34
  • 10922

c语言文件操作 fread(),fseek()

1.fread() fread的功 能: 从一个流中读数据(可以指定个数) fread 在使用过程中,首先由 FILE 确定一个文件指针 fp,fp 通过 fopen 将对象确定,fread此时对...
  • hyqsong
  • hyqsong
  • 2014年12月03日 15:50
  • 2867

C语言数据块读写函数:fread和fwrite

原文链接:http://www.letuknowit.com/archives/105     在前面曾经介绍过C语言中的各种读写函数,首先是最简单的读写一个字符的函数fputc和fgetc,在...
  • tanghui19900420
  • tanghui19900420
  • 2013年05月07日 15:30
  • 2309

C语言中fread(),fwrite(),fseek()用法和功能

1.用法:int fread(void *buffer,int size,int count,FILE *fp);int fwrite(void *buffer,int size,int count,...
  • Grace_0642
  • Grace_0642
  • 2016年12月05日 00:13
  • 1083

c语言fwrite和fread连续读写文件流

c语言fwrite和fread连续读写文件流本例程的编写是基于windows,编译器用的是gnu下的gcc: 头文件stdio.h和stdlib.h 读写函数是fwrite和fread 文件指针移动函...
  • liuhongyi0104
  • liuhongyi0104
  • 2017年01月24日 17:29
  • 5110
收藏助手
不良信息举报
您举报文章:C语言的二进制IO函数fread()和fwrite()
举报原因:
原因补充:

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