C/C++:文件I/O操作缓冲文件操作

缓冲区是为程序分配的内存块,在进行数据量比较大且不要求实时性的 I/O 操作时,
一部分数据被置于缓冲区中,只有当数据的长度快要超过缓冲区范围或时间周期达到时,
这些数据才被送入指定的位置。基于缓冲区的文件 I/O 操作减少了对设备的物理数据接口
访问次数,从而使大量数据的 I/O 操作的系统开支减少,并将实际读写速度提升。标准输
入输出库定义了文件流结构指针 FILE*作为文件的标识,同时提供了一系列缓冲文件操作
函数。有 3 个文件流是系统预定义的,下面分别介绍
 stdin:标准输入。
 stdout:标准输出。
 dtderr:标准错误。

打开与关闭文件流

打开文件流操作的函数是 fopen(),该函数与系统调用函数 open()的作用相似,它主要
用于文件和终端的输入输出方面,所以并不能对文件权限进行操作。该函数的一般形式是:
fopen(路径,打开方式);
打开方式是一组字符串,定义方法见表

字母 b 表示操作的是二进制文件,但在 Linux 系统中并不区分文本文件和二进制文件,
所以两种操作实际是一样的。如果函数执行成功,返回值是文件流指针,否则返回 NULL。
当文件不需要使用时,可用 fclose()函数将文件关闭。该函数的一般形式是: fclose(文
件流指针)。当 fclose()函数执行时,所有放在缓冲区等待写入的数据都将被写入到文件中。
如果数据未能被成功保存, fclose()函数返回–1,否则返回 0。

读取与写入文件流
读取文件流可使用函数 fread(),该函数的一般形式是:
fread(缓冲区指针, 长度, 数量, 文件流指针);

缓冲区在程序中定义,定义后将指针作为参数传递给 fread()函数。参数中的长度是指
每次读取到缓冲区内数据的长度,参数中的数量是读取操作的最多次数。该函数的返回值
是读取到缓冲区的次数,这个数字可能会小于参数中定义的最多次数。如果文件的长度
大于 fread()函数实际读取数据的长度,那么实际读取数据的总和为参数中长度与数量的
乘积。
写入文件流可使用函数 fwrite(),该函数的形式与 fread()相同。这两个函数不适用于操
作结构化数据的场合,例如操作数据库中的表,原因是 fwrite()函数写的文件可能无法在不
同硬件平台之间移植。
如果待写入的数据存储在缓冲区中,而又要立即将缓冲区的数据写入文件,可使用
fflush()函数实现。该函数的一般形式是 fflush(缓冲区指针)。

fopen()函数没有新建文件的功能,所以必须先建立一个空白文件作为数据写入的目标。

注意: 缓冲区的大小和每次操作数据的长度究竟该如何定义,这是一个值得深入研究
的问题。很多进行大规模数据存储的软件可能会因为这两个数值的设定而影响性
能。缓冲区并非限定了所操作文件的最大规模,一个大文件可分次进行读取和写
入操作,所以缓冲区的大小最好由设备的实际内存来决定。假设设备的物理内存
为 1GB,那么使用 1MB~100MB 的缓冲区都是合适的。每次操作数据的长度要

看访问数据的来源和去向,最好也依据实际硬件的性能来定,例如很多 SATA 硬
盘一次读取的数据量为 512KB, 那么在程序中也可以将每次操作数据的长度设为
该值



文件流的格式化输入与输出

标准输入输出库里提供了文件流的格式化输入输出函数 fscanf()和 fprintf(),这两个函
数的用法与 scanf()和 printf()函数极为相似。这两个函数的一般形式是:
fscanf(文件流指针, "控制字符串", 输入项列表);
fprintf(文件流指针, "控制字符串", 输出项列表);

文件流的定位操作

在标准输入输出库里函数 fseek()与系统调用函数
seek()的定义方法和使用方法几乎一致,只是 fseek()函数的第一个参数是文件流指针。除此
以外,标准输入输出库还为定位操作提供了几个函数

fpos_t 类型是标准函数库中定义的一种结构体,它也是文件流 FILE 结构体中的一个成员。

文件流操作的其他函数

文件流操作的错误处理

在 C 语言中,很多函数都使用标准输入输出库中定义的全局变量 errno 保存错误代码。
当文件流操作进行到文件末尾时,也会通过 errno 变量保存一个信息,这个信息是标准输
入输出库中定义的常量 EOF。除此以外,其他文件流操作的错误也会保存在这个变量中。
与该变量相关的函数有 3 个,它们的一般形式如下:
ferror(文件流指针);
feof(文件流指针);
clearee(文件流指针);
ferror()函数的作用是判断文件流操作是否失败,失败时返回非 0 值,否则返回 0。 feof()
函数的作用是当文件流内指向文件中位置的指针到达文件尾,函数返回非 0 值,否则返回
0。 clearee()函数的作用是清除 errno 变量内的错误信息。这 3 个函数的用法如下例所示。

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值