
《C语言优质课件》由会员分享,可在线阅读,更多相关《C语言优质课件(37页珍藏版)》请在文档大全上搜索。
1、第十六讲第十六讲 文件文件文件的概念文件的概念文件的打开与关闭文件的打开与关闭文件的读写文件的读写文件的定位文件的定位程序设计举例程序设计举例C C语言程序设计语言程序设计简介简介文件文件存储在外存储器上的数据集合。存储在外存储器上的数据集合。文件文件内存内存硬盘硬盘写写读读保存在变量和数组保存在变量和数组中的数据是暂时的中的数据是暂时的大量的数据保存到大量的数据保存到文件实现永久存储文件实现永久存储简介简介数据的层次结构数据的层次结构文件文件WangHai21M788983LiFei21F768885ZhaoXin21M818679010111001文件文件字段字段字节字节位位记录记录简介简
2、介C语言的文件处理语言的文件处理C语言把文件看作是一个有序的字节或字符流。语言把文件看作是一个有序的字节或字符流。文件文件简介简介文件的分类文件的分类(按存储形式分)(按存储形式分)文本文件文本文件数据被作为字符,并以字符的二进制编码形式保存。数据被作为字符,并以字符的二进制编码形式保存。举例举例文件文件12341 2 3 4整数整数把把4个字符的二进制编码写入文件中个字符的二进制编码写入文件中00110 00110简介简介文件的分类文件的分类(按存储形式分)(按存储形式分)二进制文件二进制文件以数据在内存中的二进制形式保存。以数据在内存中的二进制形式保存。举例举例文件文件1234整数整数00
3、000100 11010010把值把值1234的二进制编码写入文件中的二进制编码写入文件中简介简介文件的读写文件的读写缓冲文件系统缓冲文件系统系统在内存中开辟一块缓冲区以便慢速的外设与其成块地进行数据系统在内存中开辟一块缓冲区以便慢速的外设与其成块地进行数据交换。交换。向磁盘向磁盘(文件文件)输出数据:输出数据:数据数据缓冲区,装满缓冲区后缓冲区,装满缓冲区后磁盘文件。磁盘文件。从磁盘从磁盘(文件文件)读入数据:读入数据: 先一次性从磁盘文件将一批数据输入到缓冲区,先一次性从磁盘文件将一批数据输入到缓冲区, 然后再从缓冲区逐个数据读入到变量。然后再从缓冲区逐个数据读入到变量。文件文件文件指针文
4、件指针文件指针文件指针(指向文件的指针)(指向文件的指针)缓冲文件系统为每个使用的文件在内存中开辟一存储区存缓冲文件系统为每个使用的文件在内存中开辟一存储区存放其相关信息,这些信息用一个结构体变量保存,该放其相关信息,这些信息用一个结构体变量保存,该结构结构体类型体类型的名字是的名字是 FILE。 程序通过程序通过 FILE类型指针建立和文件的联系,进行关于文件类型指针建立和文件的联系,进行关于文件的一切操作。的一切操作。定义形式:定义形式:FILE *指针变量名指针变量名; 举例:举例:定义了一个结构体定义了一个结构体FILE类型的指针变量:类型的指针变量:fp。文件文件用于存放文件的缓冲区
5、首地用于存放文件的缓冲区首地址,即指向一个文件。址,即指向一个文件。FILE *fp;文件的打开文件的打开打开文件打开文件方法:方法:为了打开一个文件,首先要为该文件定义一个文件类型指针;为了打开一个文件,首先要为该文件定义一个文件类型指针;然后用然后用C语言提供的语言提供的fopen()函数函数打开文件。打开文件。fopen函数有两个参数:函数有两个参数: “文件名文件名”与与“文件使用方式文件使用方式”。 它们均是字符串。它们均是字符串。一般形式:一般形式:文件文件FILE *文件指针名文件指针名;文件指针名文件指针名fopen(文件名文件名,文件使用方式文件使用方式); 文件的打开文件的
6、打开打开文件打开文件文件使用方式文件使用方式文件文件符号符号意义意义r(read)以只读方式打开一个文本文件,若文件不存在,则返回空指针以只读方式打开一个文本文件,若文件不存在,则返回空指针w(write)以只写方式打开或创建一个文本文件,并覆盖原有数据以只写方式打开或创建一个文本文件,并覆盖原有数据a(append)以追加方式打开或创建一个文本文件,并从文件末尾写数据以追加方式打开或创建一个文本文件,并从文件末尾写数据t(text)文本文件,可省略不写文本文件,可省略不写b(binary)二进制文件二进制文件+读和写读和写文件的打开文件的打开打开文件打开文件举例举例其意义是在当前目录下打开文
7、件,文件的使用方式为其意义是在当前目录下打开文件,文件的使用方式为“只读只读”,并,并使使fp指向该文件。指向该文件。 举例举例其意义是打开其意义是打开c盘根目录下的文件,这是一个二进制文件,只允许盘根目录下的文件,这是一个二进制文件,只允许按二进制方式进行读操作。按二进制方式进行读操作。两个反斜线两个反斜线“”中的第一个表示转义字符,第二个表示根目录。中的第一个表示转义字符,第二个表示根目录。文件文件FILE *fp;fp = fopen(, r); FILE *fpabc;fpabc = fopen(“c:, rb); 文件的关闭文件的关闭关闭文件关闭文件使用使用fclose()函数。函数
8、。一般形式:一般形式:fclose(文件指针文件指针);举例举例将将fp指向的缓冲区中的数据存放到外存储器的文件中,然后释放该指向的缓冲区中的数据存放到外存储器的文件中,然后释放该缓冲区,使文件指针变量不再指向与该文件对应的缓冲区,使文件指针变量不再指向与该文件对应的FILE结构,从而结构,从而断开与文件的关联。断开与文件的关联。操作正常返回操作正常返回0,否则返回,否则返回EOF(是在(是在stdio.h文件中定义的符号常文件中定义的符号常量,值为量,值为-1)。)。文件文件FILE *fp;fclose(fp); 如果不关闭文件,将会丢失数据,并如果不关闭文件,将会丢失数据,并且一个且一个
9、C程序能同时打开的文件数有限,程序能同时打开的文件数有限,应该养成在使用完文件后关闭文件的应该养成在使用完文件后关闭文件的习惯。习惯。文件操作文件操作文件操作的一般步骤文件操作的一般步骤文件文件/* 定义声明文件指针定义声明文件指针 */FILE *fp;/* 打开文件打开文件 */fp = fopen(文件名文件名, r); /* 判断是否打开文件判断是否打开文件 */if (fp = NULL) /* 当文件打开失败时的处理当文件打开失败时的处理 */ /* 对文件进行读写操作对文件进行读写操作 */ /* 关闭文件关闭文件 */fclose(fp);文件的读写文件的读写C语言支持两种读写
10、文件的方式语言支持两种读写文件的方式顺序读写顺序读写从文件中一个接一个地读写数据,仅当读写了前一个数据后,才能从文件中一个接一个地读写数据,仅当读写了前一个数据后,才能读写下一个数据。读写下一个数据。在读写数据后,文件位置指针自动跳到下一个读写位置。在读写数据后,文件位置指针自动跳到下一个读写位置。标准输入输出只能进行顺序读写。标准输入输出只能进行顺序读写。随机读写随机读写从文件中读写数据时可不考虑数据在文件中的位置,可以在文件的从文件中读写数据时可不考虑数据在文件中的位置,可以在文件的任何位置读写。任何位置读写。在读写数据前,需要将在读写数据前,需要将文件位置指针文件位置指针移到读写位置。移
11、到读写位置。当文件以读或写方式打开,文件位置指针设置在文件头,若文件以当文件以读或写方式打开,文件位置指针设置在文件头,若文件以附加方式打开,位置设置在文件末尾。附加方式打开,位置设置在文件末尾。文件文件字符的读写字符的读写读字符读字符fgetc()函数函数从指定文件读入一个字符,该文件必须是以读或读写方式打开。从指定文件读入一个字符,该文件必须是以读或读写方式打开。返回值:返回值: 调用成功时返回读入的字符;调用成功时返回读入的字符; 文件结束时返回文件结束符文件结束时返回文件结束符EOF。举例举例 表示从文件指针变量表示从文件指针变量fp指向的文件中读出一个字符,赋给字符变量指向的文件中读
12、出一个字符,赋给字符变量ch文件文件ch = fgetc(fp);字符的读写字符的读写文件位置指针文件位置指针文件型数据结构中,用文件位置指针指向当前对文件进行文件型数据结构中,用文件位置指针指向当前对文件进行读写操作的位置。读写操作的位置。在文件打开时,该指针总是指向文件的第一个字节。读写文件时,在文件打开时,该指针总是指向文件的第一个字节。读写文件时,每读写一个字符后,该位置指针的值会自动加每读写一个字符后,该位置指针的值会自动加1,指向下一个字符。,指向下一个字符。改变位置指针的值,也就改变了下一次读写操作在文件中执行时的改变位置指针的值,也就改变了下一次读写操作在文件中执行时的位置。位
13、置。文件文件文件位置指针文件位置指针字符的读写字符的读写文件结束文件结束问题问题使用使用fgetc()函数,文件结束时返回文件结束符函数,文件结束时返回文件结束符EOF,其值为,其值为-1。这。这在对文本文件操作时不会产生问题。但对二进制文件进行读操作时,在对文本文件操作时不会产生问题。但对二进制文件进行读操作时,由于由于-1是二进制数的合法值,故将影响文件数据的读取。是二进制数的合法值,故将影响文件数据的读取。为解决此问题,为解决此问题,ANSI C提供了专门判断文件结束的函数提供了专门判断文件结束的函数feof()。feof()函数函数feof(文件指针文件指针);判断文件位置指针是否已至
14、文件尾判断文件位置指针是否已至文件尾 返回值:返回值: 函数返回值为函数返回值为1时表示已至文件尾部;时表示已至文件尾部; 为为0时则还未到文件结束处。时则还未到文件结束处。文件文件字符的读写字符的读写写字符写字符fputc()函数函数fputc(字符量,文件指针字符量,文件指针); 将一个字符写到磁盘文件上去将一个字符写到磁盘文件上去返回值:返回值: 调用成功时返回输出的字符;调用成功时返回输出的字符; 失败时返回失败时返回EOF。举例举例 表示向文件指针变量表示向文件指针变量fp指向的文件写入一个字符指向的文件写入一个字符a。文件文件fputc(a, fp);案例分析:字符的读写案例分析:
15、字符的读写问题问题打开打开“c:infile.c”文件,然后将其复制到文件,然后将其复制到“c:outfile.c”。源代码源代码文件文件#include stdio.h#include stdlib.hvoid main() FILE *infp,*outfp; char ch; if (infp = fopen(c:infile.c, r) = NULL) printf(Cannot open infile.c.n); exit(0); 案例分析:字符的读写案例分析:字符的读写源代码源代码文件文件 if (outfp = fopen(c:outfile.c, w) = NULL) prin
16、tf(Cannot open outfile.c.n); exit(0); while(!feof(infp) if (ch = fgetc(infp) != EOF) fputc(ch,outfp); fclose(infp); fclose(outfp); 字符串的读写字符串的读写读字符串读字符串fgets()函数函数fgets(字符数组名字符数组名, n, 文件指针文件指针); 从指定文件读入从指定文件读入n-1个字符到字符数组,最后加一个个字符到字符数组,最后加一个0结束符。结束符。在读完在读完n-1个字符之前遇到换行符或文件结束符个字符之前遇到换行符或文件结束符EOF,读入即结束。,
17、读入即结束。返回值:字符数组的地址。返回值:字符数组的地址。举例举例 从从fp所指的文件中读出所指的文件中读出n-1个字符送入字符数组个字符送入字符数组str中。中。文件文件fgets(str, n, fp);字符串的读写字符串的读写写字符串写字符串fputs()函数函数fputs(字符数组名字符数组名, 文件指针文件指针); 向指定的文件输出一个字符串,向指定的文件输出一个字符串,0结束符不输出。其中字符串结束符不输出。其中字符串可以是字符串常量、字符数组名或指针变量。可以是字符串常量、字符数组名或指针变量。返回值:返回值: 调用成功时,返回调用成功时,返回0; 否则返回否则返回EOF。举例
18、举例 其意义是把字符串其意义是把字符串“abcd”写入写入fp所指的文件之中。所指的文件之中。文件文件fputs(“abcd”, fp);案例分析:字符串的读写案例分析:字符串的读写问题问题从键盘上输入一串字符,写入文本文件从键盘上输入一串字符,写入文本文件“abc.c”中,再将中,再将文本文件的内容读出,显示在屏幕上。文本文件的内容读出,显示在屏幕上。源代码源代码文件文件#include stdio.h#include stdlib.hvoid main() FILE *fp; char str100, ch; if(fp = fopen(c:abc.c, w) = NULL) printf
19、( error.n); exit(0);案例分析:字符串的读写案例分析:字符串的读写源代码源代码文件文件printf(请输入一串字符:请输入一串字符:n);gets(str);fputs(str,fp);fclose(fp); if(fp=fopen(c:abc.c, r) = NULL) printf( error.n); exit(0);while(!feof(fp) if (ch = fgetc(fp) != EOF) putchar(ch);fclose(fp); 格式化读写格式化读写格式化读格式化读fscanf()函数函数fscanf(文件指针文件指针, ”格式控制字符串格式控制字符
20、串”, 地址表列地址表列); 从指定的文件中格式化读数据。从指定的文件中格式化读数据。这个函数与格式输入函数这个函数与格式输入函数scanf( )很相似,它们的区别在于,很相似,它们的区别在于,scanf( )函数是从键盘输入数据,而函数是从键盘输入数据,而fscanf( )函数是从文件读入数函数是从文件读入数据,因此在据,因此在fscanf( )函数参数中多了一个文件指针,用于指出从哪函数参数中多了一个文件指针,用于指出从哪个文件读入数据。个文件读入数据。举例举例 表示从磁盘文件中的读取一个浮点数和一个整数,分别存入变量表示从磁盘文件中的读取一个浮点数和一个整数,分别存入变量f和和d。文件文
21、件fscanf(fp, “%f%d”, &f, &d);格式化读写格式化读写格式化写格式化写fprintf()函数函数fprintf(文件指针文件指针, ”格式控制字符串格式控制字符串”, 输出表列输出表列); 格式化写数据到指定的文件中。格式化写数据到指定的文件中。这个函数与这个函数与printf( )函数很相似,它们的区别在于,函数很相似,它们的区别在于,printf()函数是函数是将数据输出到屏幕上,而将数据输出到屏幕上,而fprintf()函数是将数据输出到文件中,因函数是将数据输出到文件中,因此在此在fprintf()函数参数中多了一个文件指针,用于指出将数据输出函数
22、参数中多了一个文件指针,用于指出将数据输出到哪个文件中。到哪个文件中。举例举例 表示把变量表示把变量f和和d按指定的格式写入磁盘文件。按指定的格式写入磁盘文件。文件文件fprintf(fp, “f=%f, d=%dn”, f, d);数据块的读写数据块的读写以数据块方式读写文件以数据块方式读写文件fscanf()函数和函数和fprintf()函数对磁盘文件读写,使用方便,函数对磁盘文件读写,使用方便,易理解。但输入输出需要转化。易理解。但输入输出需要转化。因此,在内存与磁盘频繁交换数据的情况下,最好用因此,在内存与磁盘频繁交换数据的情况下,最好用fread()和和fwrite()函数。函数。f
23、read(内存地址内存地址,数据项字节数数据项字节数,数据项个数数据项个数,文件指针文件指针);fwrite(内存地址内存地址,数据项字节数数据项字节数,数据项个数数据项个数,文件指针文件指针);通常用于对二进制文件的读写操作。通常用于对二进制文件的读写操作。举例举例 表示从已打开的一个文件中读入表示从已打开的一个文件中读入5个整数,依次送入整型数组个整数,依次送入整型数组a中。中。文件文件int a5;fread(a, sizeof(int), 5, fp);文件的随机读写文件的随机读写文件内部的位置文件内部的位置按要求移动位置指针,是实现随机读写的关键。按要求移动位置指针,是实现随机读写的
24、关键。rewind()函数函数rewind(文件指针文件指针);使位置指针重新返回到文件的开头,函数无返回值。使位置指针重新返回到文件的开头,函数无返回值。ftell()函数函数ftell();得到当前文件指针位置。得到当前文件指针位置。返回值:返回值: 调用成功时,返回调用成功时,返回long int 数值,表示文件指针位置;数值,表示文件指针位置; 出错返回出错返回-1L。文件文件文件的随机读写文件的随机读写文件内部的位置文件内部的位置fseek()函数函数rewind(文件指针文件指针, 位移量位移量, 起始点起始点);改变文件的位置指针。改变文件的位置指针。其中,其中, 文件指针:是文
25、件打开时返回的文件指针。文件指针:是文件打开时返回的文件指针。 位移量:是指以起始点为基点,向前向后移动的字节数,可以为负值。位移量:是指以起始点为基点,向前向后移动的字节数,可以为负值。大多数大多数C语言版本要求位移量为语言版本要求位移量为long型数。型数。 起始点:表示从何处开始计算位移量,规定的起始点有:起始点:表示从何处开始计算位移量,规定的起始点有:返回值:操作成功返回返回值:操作成功返回0,否则返回非,否则返回非0。文件文件起始点起始点名字名字数字代号数字代号文件开始文件开始SEEK_SET SEEK_SET 0 0 当前位置当前位置SEEK_CURSEEK_CUR1 1文件末尾
26、文件末尾SEEK_ENDSEEK_END2 2案例分析:文件的随机读写案例分析:文件的随机读写问题问题设文件设文件“alphabet.c”中存放了字母表中存放了字母表“AZ”,现在打开,现在打开这个文件,用从尾部倒着读的方式将其信息读出并送屏幕这个文件,用从尾部倒着读的方式将其信息读出并送屏幕显示。显示。源代码源代码文件文件#include #include void main() FILE *fp; long i; if(fp=fopen(“c:alphabet.c”, “rb”)= NULL) printf(“ error.n”); exit(0); 案例分析:文件的随机读写案例分析:文件
27、的随机读写源代码源代码文件文件 for(i=1;i=26;i+) fseek(fp,-i,SEEK_END); /* i=1时,定位于字母时,定位于字母Z */ putchar(fgetc(fp); /* 显示读出的字符,位置指针显示读出的字符,位置指针+1 */ fclose(fp);案例分析案例分析问题问题建立一个文件,向其中写入一组学生的姓名和成绩,然后建立一个文件,向其中写入一组学生的姓名和成绩,然后从该文件中读出成绩大于从该文件中读出成绩大于80分的学生信息,并显示在屏幕分的学生信息,并显示在屏幕上。上。分析分析先用先用fopen()函数建立文件,再用函数建立文件,再用fwrite(
28、)函数写入学生记函数写入学生记录。录。用用rewind()函数定位于文件开头,用函数定位于文件开头,用fread()函数从文件中函数从文件中顺序读出一个个记录,并判断成绩是否大于顺序读出一个个记录,并判断成绩是否大于80分。若是,分。若是,则输出。则输出。在读记录之前,要用在读记录之前,要用fseek()函数定位在正确的位置上。函数定位在正确的位置上。文件文件案例分析案例分析源代码源代码文件文件#include #include void main( ) FILE *fp; int i; struct student char name10; int score; s, stud=“张雄张雄”
29、,90, “李平李平”,72, “孙兵孙兵”,80, “刘军刘军”,88, “王伟王伟”,92;案例分析案例分析源代码源代码文件文件 if(fp=fopen(“stud.bin”,”wb+”)=NULL) printf(“不能建立文件不能建立文件stud.binn”); exit(0); for(i=0;i5;i+) if(fwrite(&studi,sizeof(struct student),1,fp)!=1) printf(“写文件错误写文件错误”);案例分析案例分析源代码源代码文件文件 rewind(fp); printf(“姓名姓名 成绩成绩n”); printf(“-n”); for(i=0;i80) printf(“%s %dn”,s.name,s.score); fclose(fp); 小结小结文件文件文件文件此课件下载可自行编辑修改,供参考!此课件下载可自行编辑修改,供参考!感谢你的支持,我们会努力做得更好!感谢你的支持,我们会努力做得更好!