一、文件的相关概念
计算机文件中的文件是存储在永久储存设备上的一段数据流。所谓“永久储存设备”一般指磁盘、光盘、磁带等。其特点是所存信息可以长期、多次使用,不会因为断电而消失。也可以说,一个文件就是外部存储一段命名的存储区域(可以是不连续的)。
从操作系统文件管理角度看,文件是存放在物理磁盘上的数据信息,包括文件控制块(FCB)和数据块。文件控制块通常包括文件权限、日期(创建、读取、修改)、拥有者、文件大小、数据块信息。数据块用来存储实际的内容。在外部存储器上无论是数字、文字,还是图形、图像、声音、视频都是以文件的形式存储的。
C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据数据的组织形式,可分为ASCII文件(文本文件)和二进制文件。
ASCII文件:又称文本文件,它的每一个字节放一个ASCII代码,代表一个字符。用ASCII 形式输出与字符一一对应,因而便于对字符进行逐个处理,也便于输出字符,但一般占存储空间较多,而且要花费转换时间。
二进制文件:是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。用二进制输出数值,可
以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存上以后又需要输入到内存的,常用二进制保存。
一个整数10000,在内存中占两个字节,如果按ASCII形式输出,则占5个字节,而按二进制输出,则只占2个字节。
流文件:一个C文件就是一个字节流或二进制流。它把数据看作是一连串的字符,而不考虑记录的界限。在C语言中对文件的存取是以字符(字节)为单位的。输入输出的数据流的开始和结束仅受程序控制而不受物理符号(如回车)控制。我们把这种文件称为“流文件”。
缓冲文件系统:系统自动地在内存区为每一个正在使用地文件开辟一个缓冲区。在C 语言中,当使用标准I/O 函数(在头文件stdio.h中声明),系统会自动设置缓冲区,并通过数据流来读写文件。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。如果从磁盘向内存读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区。带缓冲的读写操作如下图所示:
二、C语言中文件的操作
(一)打开文件(fopen函数)
FILE *fp;
fp=fopen(文件名,使用文件方式)
fp=fopen("A1","r")
它表示:要打开名字为A1的文件,使用文件方式为“读入”,fopen()函数带回指向A1文件的指针并赋给fp,这样fp和A1相联系了。
(二)文件的关闭(close函数)
在使用完一个文件后应该关闭它,以防止它再被误用。“关闭”就是使文件指针变量不再指向该文件,使该文件指针变量与“文件”脱勾。
close(文件指针)
fclose(fp);
(三)文件的读写
1.fputc函数
fputc函数把一个字符写到磁盘文件上。
fputc(ch,fp);
其中ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。fp是文件指针变量,它从fopen函数得到返回值。它的作用是将字符ch的值输出到fp所指的文件上
去。
2.fgetc函数
fgetc函数从指定文件读入一个字符,该文件必须是以读或读写方式打开的。
ch=fgetc(fp);
fp是文件指针变量,ch为字符变量。fgetc函数带回一个字符,赋给ch。
3.fread函数和fwrite函数
fread函数和fwrite函数用来读写一个数据块。
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
size:要读写的字节数。
count:要进行读写多少个size字节的数据项。
fp:文件型指针。
fread(f,4,2,fp);
其中f是一个实型数组名。一个实型变量占4个字节。这个函数从fp所指向的文件读入2次(每次4个字节)的数据,存储到数组f中。
4.fprintf函数fscanf函数
fprintf函数和fscanf函数和printf函数、scanf函数作用相仿,都是格式化读写函数。只有一点不同,fprintf和fscanf函数的读写对象不是终端而是磁碟文件。
fprintf(文件指针,格式字符串,输出表列);
fscanf(文件指针,格式字符串,输入表列);
printf函数的作用是向终端fprintf(fp,"%d,%6.2f",i,t);
它的作用是将整型变量i和实型变量t的值按%d和%6.2f的格式输出到fp指向的文件上。
用fprintf函数和fscanf函数对磁盘文件进行读写,使用方便,容易理解。但由於在输入时要将ASCⅡ码转
换为二进制形式,在输出时又要将二进制形式转换成ASCⅡ码,花费时间较多。
(四)文件的定位
文件中有一个位置指针,指向当前读写的位置。如果顺序读写一个文件,每次读写一个字符,则读写完一个字符后,该位置指针自动移到下一个字符位置。如果想改变这样的规律,强制使位置指针指向其他指定的位置,可以用有关函数。
1.rewind函数
rewind函数的作用是使位置指针重新返回文件的开头。
2.fseek函数和随机读写
所谓随机读写,是指读完上一个字符后,并不一定要读写其后续的字符,而可以读写文件中任意所需的字符。
fseek(文件类型指针,位移量,起始点);
“起始点”用0、1、2表示,0代表文件开始,1为当前位置,2为文件末尾。“位移量”指以“起始点”为基点,
向前移动的字节数。大多数版本要求位移量为Long型数据,这样当文件的长度大於64k时不至於出问题。
fseek(fp,100L,0);
将位置指针移到离文件头100字节处。
3.ftell函数
ftell函数的作用是得到流式文件中的当前位置,用相对於文件开头的位移量来表示。如
果ftell函数的返回值为-1L,表示出错。
(五)出错的检测
1.ferror函数
在调用各种输入输出函数时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。如果ferror返回值为0,表示未出错,如果返回一个非零值,表示出错。在执行fopen函数时,ferror函数的初始值自动设置为0。
2.clearerr函数
它的作用是使文件错误标志和文件结束标志置为0。假设在调用一个输入输出函数时出现错误,ferror函数值就为一个非零值,在调用clearerr后,ferror的值变为0。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论