1、本章要求:本章要求:掌握掌握C C语言中文件的概念;语言中文件的概念;理解以不同方式打开文件的含义;理解以不同方式打开文件的含义;掌掌握握文文件件的的各各种种操操作作函函数数,能能正正确确对对文文件件进行读写数据操作。进行读写数据操作。本章难点:本章难点:掌握文件的各种操作函数,能正确对文掌握文件的各种操作函数,能正确对文件进行读写数据操作。件进行读写数据操作。本章重点:本章重点:掌握文件的各种操作函数,能正确对文掌握文件的各种操作函数,能正确对文件进行读写数据操作。件进行读写数据操作。9.1 文件系统的概念文件系统的概念 9.1.1 C文件概述文件概述l所谓所谓“文件文件”一般指存储在外部介
2、质上数据一般指存储在外部介质上数据的集合。的集合。lC语言把文件看作一个字节序列,即由一连语言把文件看作一个字节序列,即由一连串的字节组成,称为串的字节组成,称为“流(流(stream)”,以字节为单位访问,没有记录的界限。输以字节为单位访问,没有记录的界限。输入输出字符流的开始和结束只由程序控制入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因而不受物理符号(如回车符)的控制。因此也把这种文件称作此也把这种文件称作“流式文件流式文件”。按文件中数据的组织形式来分按文件中数据的组织形式来分:文本文件文本文件每一个字节存放一个每一个字节存放一个ASCII码,代表一个码,代表
3、一个字符。由文本行组成,并以换行符字符。由文本行组成,并以换行符n结尾,有文件结束标志。结尾,有文件结束标志。二进制文件二进制文件把数据按其在内存中的存储形式原样存放把数据按其在内存中的存储形式原样存放在磁盘上,一个字节并不对应一个字符。在磁盘上,一个字节并不对应一个字符。例:例:00000100 1101001000110001 00110010 00110011 0011010000000100 11010010整数整数1234内存存储形式内存存储形式二进制形式二进制形式ASCII形式形式特点特点:存储量大、速度慢、存储量大、速度慢、便于对字符操作便于对字符操作特点:存储量小、速度快、特点
4、:存储量小、速度快、便于存放中间结果便于存放中间结果9.1.2缓冲文件系统缓冲文件系统 C语言使用的文件系统分为缓冲文件系语言使用的文件系统分为缓冲文件系统(标准统(标准I/O)和非缓冲文件系统(系统)和非缓冲文件系统(系统I/O)。)。ANSI C 标准不再采用非缓冲文件系统。本章标准不再采用非缓冲文件系统。本章主要介绍缓冲文件系统中文件的操作。主要介绍缓冲文件系统中文件的操作。9.2 文件的打开与关闭文件的打开与关闭 文件操作的过程:对磁盘文件的操作必文件操作的过程:对磁盘文件的操作必须须“先打开,后读写,最后关闭先打开,后读写,最后关闭”。9.2.1 文件类型指针文件类型指针 在操作文件
5、时,在操作文件时,C语言利用一个结构体语言利用一个结构体类型的变量存放文件的信息。该变量的结构类型的变量存放文件的信息。该变量的结构体类型由系统取名为体类型由系统取名为FILE。用一个指针变量指向指向存放该文件信用一个指针变量指向指向存放该文件信息的结构体类型变量,这个指针称为息的结构体类型变量,这个指针称为文件指文件指针针。定义形式:。定义形式:FILE*指针变量标识符;指针变量标识符;对文件操作需要对文件操作需要#include 9.2.2 文件的打开文件的打开一般形式为:一般形式为:文件指针名文件指针名=fopen(文件名,使用文件方式文件名,使用文件方式);其中:其中:“文件指针名文件
6、指针名”是指向是指向FILE类型的指针变类型的指针变量。量。“文件名文件名”是被打开文件的文件名,可以是被打开文件的文件名,可以是字符串常量或字符数组。是字符串常量或字符数组。“使用文件方式使用文件方式”是指文件的类型和操作是指文件的类型和操作要求。要求。例如:例如:FILE*fp;fp=fopen(c:tcsource.dat,r);注意反斜杠的表示方法注意反斜杠的表示方法见下表见下表打开方式打开方式 含义及说明含义及说明 r 以以只读只读方式打开一个文本文件,方式打开一个文本文件,只允许读数据。只允许读数据。只能打开存在的文件。只能打开存在的文件。w以以只写只写方式打开或建立一个文本方式打
7、开或建立一个文本文件,只允许写数据。文件,只允许写数据。若文件不存在,则新建;若文件若文件不存在,则新建;若文件存在,则删除原文件,重新建。存在,则删除原文件,重新建。a以以追加追加方式打开一个文本文件,方式打开一个文本文件,并在文件末尾写数据。并在文件末尾写数据。若文件不存在,则新建;若文件若文件不存在,则新建;若文件存在,则在源文件末尾添加内容存在,则在源文件末尾添加内容。说明:说明:1.打开方式带上打开方式带上“b”表示是对二进制文件进行表示是对二进制文件进行操作。带上操作。带上“+”表示既可以读,又可以写,表示既可以读,又可以写,而对待文件存在与否的不同处理则按照而对待文件存在与否的不
8、同处理则按照“r”、“w”、“a”各自的规定。各自的规定。2.若打开失败,若打开失败,fopen都返回一个空指针都返回一个空指针NULL。文件打开可能出现的错误有:。文件打开可能出现的错误有:试图以试图以“读读”方式(带方式(带“r”的方式)打开的方式)打开一个并不存在的文件。一个并不存在的文件。新建文件,而磁盘上没有足够的剩余空间或新建文件,而磁盘上没有足够的剩余空间或磁盘被写保护。磁盘被写保护。试图以试图以“写写”方式,打开方式,打开“只读只读”文件。文件。带带“w”或或“a”或或“r+”或或“rb+”方式方式 FILE*fp;fp=fopen(c:tcsource.dat,r);/*此处
9、开始对文件读此处开始对文件读*/若打开失败,若打开失败,fp指针变量里面是空指针指针变量里面是空指针NULL,对空指针的读写操作会出错。对空指针的读写操作会出错。为避免因上述原因的出错,常用以下的方法来为避免因上述原因的出错,常用以下的方法来打开一个文件:打开一个文件:if(fp=fopen(c:myfile.dat,w+)=NULL)printf(This file could not be opened!n);else /*此处编写对文件读此处编写对文件读写的代码写的代码*/9.2.3 文件的关闭(文件的关闭(fclose函数)函数)文件使用完后,为确保文件中的数据不丢文件使用完后,为确保
10、文件中的数据不丢失,都要使用文件的关闭函数失,都要使用文件的关闭函数fclose进行关闭,进行关闭,其调用形式:其调用形式:fclose(文件指针变量文件指针变量);功能:关闭一个由功能:关闭一个由fopen()函数打开的文件。函数打开的文件。例如:例如:fclose(fp);前面例子中,把前面例子中,把fopen函数返回的指针赋函数返回的指针赋值给值给fp,现在用,现在用fclose函数使文件指针函数使文件指针fp与文与文件脱离,同时刷新文件输入输出缓冲区。件脱离,同时刷新文件输入输出缓冲区。9.3 文件的读写文件的读写 打开文件后都会返回该文件一个文件类打开文件后都会返回该文件一个文件类型
11、指针型指针(fp),程序中就是通过这个指针执行对,程序中就是通过这个指针执行对文件的读和写。文件的读和写。在语言中提供了多种文件读写的函数:在语言中提供了多种文件读写的函数:l字符读写函数:字符读写函数:fgetc和和fputcl字符串读写函数:字符串读写函数:fgets和和fputsl数据块读写函数:数据块读写函数:fread和和fwritel格式化读写函数:格式化读写函数:fscanf和和fprinf上面的文件读写函数均是指顺序读写,即读上面的文件读写函数均是指顺序读写,即读写了一条信息后,写了一条信息后,文件读写位置指针文件读写位置指针自动指自动指向下一个读写单元。向下一个读写单元。内容
12、内容内容内容内容内容内容内容内容内容内容内容“r”方式方式文件读文件读写指针写指针内容内容内容内容内容内容内容内容内容内容内容内容“w”方式方式文件读文件读写指针写指针内容内容内容内容内容内容内容内容内容内容内容内容“a”方式方式文件读文件读写指针写指针文件读文件读写指针写指针文件读文件读写指针写指针文件读文件读写指针写指针内容内容文件读文件读写指针写指针注意注意区别区别文件文件指针指针读文件时注意不要超过文件末尾:读文件时注意不要超过文件末尾:对于文本文件,由于它的结束标记是对于文本文件,由于它的结束标记是EOF(即(即-1)因此可通过读取的字符是不)因此可通过读取的字符是不是结束标志来判断
13、。是结束标志来判断。对于二进制文件,由于没有对于二进制文件,由于没有EOF的结束标的结束标志,使用系统提供的志,使用系统提供的feof()函数来判断函数来判断feof()的使用格式是:的使用格式是:feof(fp);其中,其中,fp是文件指针变量,如果文件读取结是文件指针变量,如果文件读取结束则返回非束则返回非0值,没结束返回值,没结束返回0。while(!feof(fp)/*此处写入读操作语句此处写入读操作语句*/文本文件也可使用文本文件也可使用feof()函数按上面来的形式函数按上面来的形式来判断是否读取结束。来判断是否读取结束。9.3.2字符读写函数字符读写函数 1字符读函数字符读函数f
14、getc()功能是从指定的文件中读一个字符,函数调功能是从指定的文件中读一个字符,函数调用的一般形式为:用的一般形式为:字符变量字符变量=fgetc(文件指针文件指针);例如:例如:ch=fgetc(fp);FILE*fp;char ch;fp=fopen(9-1.txt,r);while(!feof(fp)ch=fgetc(fp);putchar(ch);例:显示指定文例:显示指定文件中的内容件中的内容2字符写函数字符写函数fputc()将一个字符写入到文件中,调用的一般格将一个字符写入到文件中,调用的一般格式如下:式如下:fputc(ch,fp);fputc函数也有返回值,若写操作成功,则
15、函数也有返回值,若写操作成功,则返回一个向文件所写字符的值;否则返回返回一个向文件所写字符的值;否则返回EOF,表示写操作失败。,表示写操作失败。fp=fopen(9-1.txt,w);fputc(A,fp);fp=fopen(9-1.txt,a);fputc(A,fp);在在e盘新建文件盘新建文件abc.txt,在其,在其中写入中写入26个大个大写字母,每行写字母,每行10个字母个字母例:例:while(ch=fgetc(fp1)!=EOF)9.3.3 字符串读写函数字符串读写函数1字符串读函数字符串读函数fgets():fgets(字符数组名,字符数组名,n,文件指针,文件指针);其功能是
16、:从指定的文件中读一个字符串到其功能是:从指定的文件中读一个字符串到字符数组中。从文件中读出的字符串不超字符数组中。从文件中读出的字符串不超过过 n-1个字符。在读入的最后一个字符后加个字符。在读入的最后一个字符后加上串结束标志上串结束标志0。注意:注意:fgets函数从文件中读取字符直到遇函数从文件中读取字符直到遇见回车符或见回车符或EOF为止,或直到读入了所限为止,或直到读入了所限定的字符数(至多定的字符数(至多n-1个字符)为止,个字符)为止,例如:例如:fgets(str,n,fp);函数读成功返回函数读成功返回str指针;失败返回一个空指针;失败返回一个空指针指针NULL。2字符串写
17、函数字符串写函数fputs():fputs(字符串,文件指针字符串,文件指针);将指定的字符串写到文件中,如:将指定的字符串写到文件中,如:fputs(China,fp);函数返回函数返回0时,表明操作成功;返回非时,表明操作成功;返回非0时,时,表明写操作失败。表明写操作失败。while(ch=fgetc(fp1)!=EOF)fputc(ch,fp2);char ch;while(!feof(fp1)fgets(ch,80,fp1);fputs(ch,fp2);char ch80;9.3.4 格式读写函数格式读写函数1.格式化读函数格式化读函数fscanf()fscanf(文件指针文件指针,
18、“格式字符串格式字符串”,输入列表输入列表);2.格式化写函数格式化写函数fprintf()fprintf(文件指针文件指针,“格式化字符串格式化字符串”,输出列表输出列表);对比对比scanf()函数和函数和printf()函数函数从键盘输入:从键盘输入:scanf(“%d”,&a);从文件输入:从文件输入:fscanf(fp,“%d”,&a);在屏幕上打印:在屏幕上打印:printf(“%d”,a);在文件中写入:在文件中写入:fprintf(fp,“%d”,a);s1.txt文件中存放着一些学生分数,统计及文件中存放着一些学生分数,统计及格人数,并把结果写入格人数,并把结果写入s2.txt文件文件9.3.5 数据块读写函数数据块读写函数1.写数据块函数写数据块函数fwrite()fwrite(buffer,size,count,fp);如:如:int xa10=1,2,3,4,5,6,7,8,9,10;将数组整体写入文件中的语句:将数组整体写入文件中的语句:fwrite(xa,20,1,fp);2.读取数据块函数读取数据块函数fread()fread(buffer,size,count,fp);如:如:float a5;fread(a,4,5,fp);从文件中每次读从文件中每次读4个字节个字节(一个实数一个实数)送入实送入实数组数组a中,连续读中,连续读5次。次。