《C语言程序设计 教学课件 ppt 作者 蒋清明C语言程序设计__第8章》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 蒋清明C语言程序设计__第8章(56页珍藏版)》请在金锄头文库上搜索。
1、第8章 文 件,返回总目录,目 录,8.1 文件概述,8.2 文件的打开与关闭,8.3 文件的读写,8.5 文件检测,8.4 文件的定位,返回总目录,8.6 习题八,基本要求: )熟悉文件及文件类型指针的概念; )熟练掌握文件的打开、关闭、读写、定位与检测等针对文件的基本操作; 学习重点: )文件类型指针的概念; )文件的打开、读写与关闭等操作;,在计算机系统中,文件是指存储在外部介质上的一组相关数据的有序集合。该数据集称为文件,文件的名称称为文件,文件的命名规则与C标识符相同。C语言将输入输出设备也当作文件来处理。文件可以从不同的角度来进行分类: (1) 按文件所依附的介质分类,有卡片文件、
2、纸带文件、磁带文件、磁盘文件等。 (2) 按文件内容来分类,有源文件、目标文件、数据文件等。 (3) 按文件中数据组织形式分类:有字符文件和二进制文件。 (4) 按文件操作可划分为输入文件、输出文件、输入输出文件。,8.1 文件概述与文件类型指针,8.1.1 文件概述,返回目录,8.1 文件概述与文件类型指针,8.1.1 文件概述,字符文件又称为ASCII文件或文本文件,按字符方式存储,可用字符操作命令如NotePad.exe进行直接读写,但占存储空间较多;二进制文件是以二进制方式存储,占存储空间少,用NotePad.exe不便进行直接读写。图8.1显示了十进制整数12345以文本文件存储和以
3、二进制存储的区别,在C语言系统中,一个文件就是一个字符(字节)流。,8.1 文件概述与文件类型指针,8.1.1 文件概述,C语言文件系统有两种:缓冲文件系统(标准I / O)和非缓冲文件系统(系统I / O)。缓冲文件系统的特点是:系统在内存为正在使用的每一个文件开辟一个固定容量的“缓冲区”,当执行读文件的操作时,从磁盘上将指定的文件数据先读入缓冲区,装满后再从缓冲区逐个将数据送到程序数据区;当执行写文件的操作时,先将程序数据写入缓冲区,待缓冲区装满后再送到磁盘。如图8.2所示。,8.1 文件概述与文件类型指针,8.1.1 文件概述,非缓冲文件系统的特点是:系统不自动为正在使用的每一个文件开辟
4、一个固定容量“缓冲区”,而由程序根据自身的需要及系统的存储资源情况来为每一个文件设定缓冲区。目前仍有许多C版本支持非缓冲文件系统,但1983年ANSI C标准决定不采用非缓冲区文件系统,因此建议不要采用不符合ANSI C标准的那些部分,以免降低程序的可移植性。,8.1 文件概述与文件类型指针,8.1.2 文件类型指针,文件类型指针是缓冲文件系统中最重要的概念。对缓冲文件系统来说,ANSI C为每个被使用的文件在内存开辟一小块固定大小的区域,用于存放文件的属性状态(如文件的名字、文件的性质、文件的当前状态等信息),该区域利用一个结构类型变量存放。该变量的结构体类型是由系统定义的,取名为FILE,
5、其定义包含在头文件stdio.h中,格式如下:,8.1 文件概述与文件类型指针,8.1.2 文件类型指针,typedef struct short level; /* 缓冲区“满”或“空”的标志 */ unsigned flags; /* 文件状态标志 */ char fd; /* 文件描述符 */ unsigned char hold; /* 若无缓冲区不读取字符 */ short bsize; /* 缓冲区的大小 */ unsigned char *buffer; /* 数据缓冲区的位置 */ unsigned char *curp; /* 当前活动指针 */ unsigned istem
6、p; /* 临时文件描述符 */ short token; /* 用于有效性检查 */ FILE;,8.1 文件概述与文件类型指针,8.1.2 文件类型指针,在操作文件以前,应先定义文件变量指针。FILE类型允许定义若干FILE类型指针变量,以便存放若干待操作文件的信息,定义格式为: FILE *fp1, *fp2; 按照上面的定义,fp1和fp2均为指向FILE类型的指针变量,允许系统打开2个可操作的文件。换句话说,一个文件有一个文件变量指针,今后对文件的访问,会转化为针对文件变量指针的操作。,8.2 文件的打开与关闭,8.2.1 文件的打开,C语言提供了打开文件的函数fopen( )。该函
7、数原型在stdio.h文件中,其调用格式为: FILE *fp; fp=fopen(“文件名”, ”文件操作模式“); 或者将上述两句合并为一句: FILE *fp=fopen(“文件名”, “文件操作模式”); 其功能是打开一个由“文件名”指向的外部文件,返回指向该文件的文件指针。在文件名中可以指明盘符及文件路经。若文件打开成功,则fp为一非空指针,否则fp值为NULL,“文件操作模式”由表8.1给出。,返回目录,8.2 文件的打开与关闭,8.2.1 文件的打开,表8.1 文件操作模式,例如: FILE *fp; fp=fopen(“a:abc.txt“, “r“); 其功能是以“只读”方式
8、在A:盘根目录下打开名为abc.txt的文本文件,允许进行“读”操作,并使fp指向该文件。两个反斜线“ ”属于转义字符,代表反斜杠字符“,又如: FILE *fp; fp=fopen(“c:test.txt“, “rb“); 其意义是打开C盘根目录下的文件test.txt,只允许按二进制方式进行读操作。,8.2 文件的打开与关闭,8.2.1 文件的打开,8.2 文件的打开与关闭,8.2.1 文件的打开,对于文件操作模式的几点说明: (1) 凡用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出。 (2) 用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文
9、件,若打开的文件已经存在,则将该文件删去,重建一个新文件。 (3) 若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。但此时该文件必须是存在的,否则将会出错。,8.2 文件的打开与关闭,8.2.1 文件的打开,对于文件操作模式的几点说明: (4) 在打开一个文件时,如果出错,fopen( )将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。 (5) 把一个文本文件读入内存时,系统将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时,系统也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不
10、存在这种转换。 (6) 标准输入文件(键盘),标准输出文件(显示器),标准出错输出(显示器)是在程序运行时由系统自动打开的,可直接使用而无需打开与它们相连的终端文件。,8.2 文件的打开与关闭,8.2.1 文件的打开,例8.1 打开一个文件的操作。 #include #include /*包含exit( )函数所在的头文件*/ main( ) FILE *fp; if(fp=fopen(“c:test.txt“,“rb“)=NULL) printf(“nerror on open c:test.txt file!“); getch(); exit(0); ,8.2 文件的打开与关闭,8.2.2
11、 文件的关闭,文件一旦使用完毕,要用关闭文件函数把文件关闭,以避免出现文件数据丢失等错误。所谓“关闭文件”,就是使文件指针变量不再指向该文件,即让文件指针变量与被关闭的文件实现“脱勾”。另一个重要作用是将未满的输出缓冲区数据写入文件,将未满的输入缓冲区数据取出,以避免数据丢失。C语言提供了关闭文件的fcolse函数,该函数原型也在stdio.h文件中,其调用格式为: fclose(文件指针); 若关闭文件操作成功,fclose()函数返回值为0;否则返回EOF(1)。,8.2 文件的打开与关闭,8.2.2 文件的关闭,例8.2 以读方式打开和关闭一个名为test.dat的二进制文件的基本模式。
12、 #include #include main( ) FILE *fp; if (fp=fopen(“test.dat“,“rb“)=NULL) printf(“cannot open filen“); exit(0); /*对文件执行读操作,这里暂略*/ if (fclose(fp) printf(“file close error!n“); ,8.3 文件的读写,8.3.0 引言,当文件按指定的工作方式打开以后,就可以执行对文件的读和写。针对文本文件和二进制文件的不同性质,对文本文件来说,可按字符读写或按字符串读写;对二进制文件来说,可进行成块的读写或格式化的读写。 语言提供多种文本文件读
13、写函数,如表8.2所示,这些函数原型都包含在头文件stdio.h中。,表8.2 C语言提供的主要文件读写函数,返回目录,8.3 文件的读写,8.3.1 字符读写函数fgetc()和fputc(),fgetc和fputc函数用于对文本文件进行单个字符的读写。调用格式为: ch=fgetc(fp); /*fp为文件指针*/ fputc( ch, fp); 其功能是: (1) fgetc(fp)函数从指定文件的当前位置返回一个字符,并将文件指针指示器移到下一个字符位置,如果已到文件尾,函数返回一个EOF(EOF是一个符号常量,值为-1,定义在stdio.h文件中),表示读入的不是正常的字符而是文件结
14、束符。若读写文件完成,则应关闭文件。 (2) fputc(ch, fp)函数完成将字符ch的值写入fp所指向的文件的当前位置(文件内部指针指向)处,并将文件内部指针后移一位。fputc ()函数的返回值是所写入字符的值,出错时返回EOF。,8.3 文件的读写,8.3.1 字符读写函数fgetc()和fputc(),例8.3 从键盘输入一行字符,存到磁盘文件test.txt中。 #include #include main( ) FILE *fp; /*定义文件变量指针*/ char ch; if(fp=fopen(“test.txt“,“w“)=NULL)/*以只写方式打开文件*/ print
15、f(“cannot open file!n“); exit(0); while (ch=fgetchar()!=n) /*当输入字符为非回车符*/ putchar(ch); /*显示输入的字符*/ fputc(ch,fp); /*将字符写入文件*/ fclose(fp) ; ,例8.4 将存放于磁盘的指定文本文件的内容按只读方式读出,然后再将其显示到屏幕上。要求采用带参数的main( ),指定的磁盘文件名由命令行方式通过键盘输入。 #include #include main(int argc,char *argv) /*含参数的主函数*/ char ch;FILE *fp;int i; if
16、(argc=1) printf(“ no file name, strike any key exit“); getch();exit(0); if (fp=fopen(argv1,“r“)=NULL printf(“cannot open filen“);exit(0); while (ch=fgetc(fp)!=EOF) putchar(ch); fclose(fp); ,8.3 文件的读写,8.3.1 字符读写函数fgetc()和fputc(),8.3 文件的读写,8.3.2 字符串读写函数fgets()和fputs(),C语言提供fgets()和fputs()函数用于实现对文本文件进行字符串读写操作。这两个函数的调用格式为: fgets(字符数组,n,fp); fputs(字