C语言程序设计第7章_第1页
C语言程序设计第7章_第2页
C语言程序设计第7章_第3页
C语言程序设计第7章_第4页
C语言程序设计第7章_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第7章章 文件文件7.1 7.1 文件概述文件概述 7.2 7.2 文件的打开和关闭文件的打开和关闭 7.3 7.3 文件的顺序读写文件的顺序读写 7.4 7.4 文件的定位与随机读写文件的定位与随机读写 7.5 7.5 文件状态检查函数文件状态检查函数 7.6 7.6 文件输入文件输入/ /输出小结输出小结 7.1 文件概述7.1.1 7.1.1 文件的概念文件的概念 7.1.2 7.1.2 文件的分类文件的分类 7.1.3 7.1.3 文件的访问方式文件的访问方式 7.1.4 7.1.4 文件类型指针文件类型指针 7.1.5 7.1.5 文件的处理过程文件的处理过程 7.1.1 文件的概

2、念文件的概念文件的定义: 文件是指一组相关数据的有序集合,它是存储在外部介质上数据的集合体。 程序文件指的是程序代码的集合体,而数据文件则是已处理(或待处理)数据的集合体。 对文件而言,最基本的操作就是读操作和写操作。7.1.1 文件的概念文件的概念 缓冲型文件系统的文件读/写示意图7.1.2 文件的分类文件的分类 C语言中的文件文件亦称流式文件,其内容是由一个个的字符(或字节)按一定的顺序组成的,这里的字符或字节序列称之为字节流。 根据数据的存储形式,C语言中的文件可分为文本文件和二进制文件两种。 文本文件 以ASCII码字符形式存储的文件称为文本文件,又叫ASCII文件。在文本文件中,存贮

3、一个字符需要一个字节,虽然此时处理字符比较方便,但文本文件一般要占用较大的存储空间。 二进制文件 在二进制文件中,数据是以二进制的形式存贮的,结构紧凑利于节省大量的磁盘空间。 由于二进制文件中的一个字节并不直接对应着一个字符,因此数据需要转换后才能以字符的形式输出; 7.1.3 文件的访问方式文件的访问方式 文件的访问形式可分为顺序访问和随机访问两种。顺序访问又称为顺序读写,随机访问又叫随机读写。 有时也把进行顺序读写操作的文件称为顺序文件,而把进行随机读写操作的文件称为随机文件。 无论是顺序文件还是随机文件,在文件内部专门设置了一个指向当前读写位置的指针,就象在一部电梯中用楼层显示器来指示当

4、前所处的楼层。 7.1.3 文件的访问方式文件的访问方式 在顺序文件中,读写位置指针总是按照字节的顺序由前往后移动,每当读完一个字符,指针会自动地移到下一个字符的位置上。因此对文件的操作只能按顺序进行。 在随机文件中,读写位置指针可以根据需要自由地移到文件的任意位置上。也就是说在随机文件中,读完了一个字符之后,不一定非得要读下一个字符,而是可以重新调整位置指针的值,使其指向文件的其它位置,这样就可以随意访问文件了。 7.1.4 文件类型指针文件类型指针 正在使用的文件的信息(如文件名、文件状态、数据缓冲区的位置、文件读写的当前位置等)都被保存在一个特定的结构类型变量中,该变量称为文件结构变量(

5、或FILE类型变量)。 FILE类型的定义如下:7.1.5 文件的处理过程文件的处理过程C语言对文件处理的步骤如下: 第一步:打开文件 第二步:读文件或者写文件,其中读文件是指从文件中读取数据,写文件指的是把数据写到文件中去 第三步:关闭文件7.1.5 文件的处理过程文件的处理过程 在对文件进行操作之前,必须事先定义一个指向FILE类型的指针变量,该变量称为“文件类型指针变量” 。 指向文件类型的指针变量的定义格式: FILE *指针变量名;例如: FILE *fp; FILE *fp1,*fp2,*fp3; /* 如果程序中要同时处理3个文件,则要定义3个文件类型指针变量 */7.1.5 文

6、件的处理过程文件的处理过程 在C语言中,当程序运行时,系统都会自动打开三个标准文件:标准输入、标准输出和标准出错输出,它们分别对应着下述的文件类型指针名:stdin : 标准输入文件的文件指针stdout:标准输出文件的文件指针stderr:标准出错输出文件的文件指针 由于标准文件是受系统控制的,其打开和关闭都由系统自动完成,因此在程序中这三个标准的文件类型指针,它不需要用户进行的单独定义或说明,能够直接使用,区别与一般文件的打开和关闭操作。 7.1.5 文件的处理过程文件的处理过程 例例7.17.1 产生100以内的全部偶数,要求把这些数据写入到C盘根目录下一个名为even246.dat的文

7、本文件中去。 7.1.5 文件的处理过程文件的处理过程 例例7.27.2打开由例7.1创建的数据文件even246.dateven246.dat,要求读取文件中的偶数,并按每行十个数的格式将它们显示在屏幕上。7.2 文件的打开和关闭 7.2.1 7.2.1 打开文件的函数打开文件的函数7.2.2 7.2.2 关闭文件的函数关闭文件的函数7.2.1 打开文件的函数打开文件的函数函数原型函数原型:FILE FILE * *fopen(char fopen(char * *pname, char pname, char * *mode)mode)函数功能函数功能: 按指定的mode方式打开由pnam

8、e指向的文件。参数说明参数说明:pname:代表指向文件名字符串的指针变量mode:给出文件打开后的处理方式(如表7.1所示)函数返回值函数返回值: 若文件能正常打开,则返回值为一个指向被打开文件的指针,反之返回NULL值(即空地址)。表7.1 函数fopen()中的参数说明 7.2.1 打开文件的函数打开文件的函数 当出现下述情况中的任何一种时,数据文件将不能正确被打开:l 用”r”方式打开一个并不存在的文件l 磁盘读写错误l 在新建文件时,由于磁盘的剩余空间不够,不足以创建新的文件 当上述情况发生时,函数fopen() 将返回一个空指针NULL表示出错7.2.1 打开文件的函数打开文件的函

9、数 在实际编程时,通常采用下述这种带if结构的程序段来打开文件,增强了程序的灵活性。7.2.27.2.2 关闭文件的函数关闭文件的函数函数原型函数原型:int fclose(FILE *fp)函数功能函数功能:关闭fp所指向的文件参数说明参数说明:fp为文件类型指针返回值返回值: 如果文件能正常关闭,则函数返回值为0;反之当文件关闭出现错误时,返回值为EOF,此时可用ferror()函数来测试。注意事项注意事项: 当某个应用程序结束时,假设文件缓冲区中的数据未满,如果此时未正常关闭文件,那么保存在文件缓冲区中的数据将会丢失。 因此,当文件不再需要使用时,应及时关闭文件。这样做能把暂存在文件缓冲

10、区中的数据全部写入文件之中,从而保证了数据的完整性,避免数据的丢失 。 7.3 文件的顺序读写文件的顺序读写7.3.1 7.3.1 文本文件的顺序读写文本文件的顺序读写 7.3.2 7.3.2 二进制文件的顺序读写二进制文件的顺序读写7.3.1 文文本文件的顺序读写本文件的顺序读写 字符的输入函数字符的输入函数fgetc( )fgetc( )和和getc( )getc( )函数原型函数原型:int fgetc(FILE int fgetc(FILE * *fp)fp) int getc(FILE int getc(FILE * *fp)fp)函数功能函数功能: 两个函数都是从fp所指定的文件中

11、读取一个字符参数说明参数说明: fp是一个文件类型指针,它指向要读的文件。返回值返回值: 如果正常返回,则返回读取的字符代码,否则返回EOF;如果读到文件结束符(z)时,也返回EOF。7.3.1 文文本文件的顺序读写本文件的顺序读写 字符的输出函数字符的输出函数fputc( )fputc( )和和putc( )putc( )函数原型函数原型:int fputc(char ch, FILE int fputc(char ch, FILE * *fp)fp) int putc(char ch, FILE int putc(char ch, FILE * *fp)fp)函数功能函数功能: 把字符ch

12、写入到fp所指定的文件中去参数说明参数说明: ch为整型(或字符型)变量(或常量),fp是文件指针返回值返回值: 在文件的当前读写位置写入一个字符,若字符写入成功,则函数返回该字符的ASCII值,反之将返回EOF。 TC集成开发环境下的文件操作方法 假设目前处在假设目前处在TCTC的集成开发环境(的集成开发环境(IDEIDE)之中。若想从)之中。若想从IDEIDE切换到切换到MS-MS-DOSDOS方式下,请执行方式下,请执行FileFile菜单下的菜单下的OS shellOS shell命令,随后屏幕立即出现命令,随后屏幕立即出现MS-MS-DOSDOS画面,图中命令提示符最左边的画面,图中

13、命令提示符最左边的D:TC2D:TC2就是当前的缺省目录。就是当前的缺省目录。 此时如果想从MS-DOS方式下重新返回到TC的IDE状态,则在命令提示符的光标处敲入命令exit即可。 exit MSDOS中的type命令简介 type命令是MS-DOS中的一条内部命令,用于屏幕显示某一个指定的文本文件的内容,在MS-DOS方式下使用type命令的格式为: typetype 驱动器名驱动器名路径名路径名 一个被指定的文本文件名一个被指定的文本文件名.扩展名扩展名 注意事项:注意事项: 在使用type命令时,每次显示的文本文件只能是一个,不能通过使用文件的通配符(*或?)来达到一次显示多个文本文件

14、的目的。另外,被指定的文本文件如果有扩展名的,则在命令行格式中一定要补写上,省略不写是不行的。 在type命令中如果省略了驱动器名和路径名这两个选项,则表示被要求显示的那个文本文件处在当前驱动器的当前目录下(如前面所说的D:TC2)。 7.3.1 文文本文件的顺序读写本文件的顺序读写 例例7.37.3 创建文本文件。首先从键盘上输入一个文件名,然后键入一些字符,要求把这些字符逐个写入到刚才指定的那个文本文件中去,直到输入“”结束。7.3.1 文文本文件的顺序读写本文件的顺序读写例7.3 完整的运行过程如下图所示 第第1步:输入数据文件名:步:输入数据文件名:1st.dat第第2步:步:输入文件

15、内容,最后以输入文件内容,最后以符号结束符号结束第第3步:步:通过通过type命令显示该文本文件的内容命令显示该文本文件的内容 7.3.1 文文本文件的顺序读写本文件的顺序读写 例例7.47.4复制文本文件。要求把第一个文本文件的内容全部复制到第二个文本文件中去。称第一个文件为源文件,称第二个文件为目标文件。 假设复制之前源文件已经存在了。源文件名和目标文件名要求在程序运行时由键盘输入。 7.3.1 文文本文件的顺序读写本文件的顺序读写 例7.4运行时首先要求输入源文件名和目标文件名,这里假设源文件名为1st.dat1st.dat,目标文件名为2nd.dat2nd.dat,其中源文件1st.d

16、at1st.dat已经由例例7.37.3产生好了。运行过程如下:Enter the source filename:1st.dat(输入源磁盘文件名)Enter the target filename:2nd.dat(输入目标磁盘文件名) 当文件复制结束后,为了验证目标文件2nd.dat的内容是否和源文件1st.dat的完全相同,可以在MS-DOS方式下分别执行下面这两条type命令:type 1st.dattype 1st.dat (显示源文件的内容)type 2nd.dattype 2nd.dat (显示目标文件的内容) 7.3.1 文文本文件的顺序读写本文件的顺序读写 字符串输入函数字符

17、串输入函数fgets( )fgets( ) 函数原型:char *fgets(char *str, int n, FILE *fp) 函数功能: 从指定的文件中读取一个字符串参数说明: str为读取到的字符串的地址,可以是指针变量或数组;n为限定读取的字符个数;fp为指定读取的文件。返回值: 从文件fp的当前读写位置开始,最多读出(n-1)个字符(包括换行符),同时将字符串结束标志0也复制到str中去。正常返回值为str的首地址,当读到文件末尾或出错时,返回NULL。 7.3.1 文文本文件的顺序读写本文件的顺序读写 字符串输入函数字符串输入函数fgets( )fgets( ) 函数原型:ch

18、ar *fgets(char *str, int n, FILE *fp) 函数功能: 从指定的文件中读取一个字符串参数说明: str为读取到的字符串的地址,可以是指针变量或数组;n为限定读取的字符个数;fp为指定读取的文件。返回值: 从文件fp的当前读写位置开始,最多读出(n-1)个字符(包括换行符),同时将字符串结束标志0也复制到str中去。正常返回值为str的首地址,当读到文件末尾或出错时,返回NULL。 7.3.1 文文本文件的顺序读写本文件的顺序读写 例例7.57.5 将从键盘上输入的若干行字符写到一个名为 mystring.datmystring.dat 的文本文件中去,假设每行字

19、符串的长度不超过80。7.3.1 文文本文件的顺序读写本文件的顺序读写例例7.57.5运行示范 在调用函数list_1( )从文件中逐个读取字符时,显示的结果表明保存在文件中的每个字符串都已经是以换行符n结束的。 而在调用函数list_2( )时,屏幕显示结果中出现了空行,每输出完一行数据后都空了一行,除了说明文件中已经存有换行符n之外,还说明用puts()输出字符串时会自动换行。 7.3.1 文文本文件的顺序读写本文件的顺序读写 格式化输入函数格式化输入函数fscanf( )fscanf( )原型:原型: int fscanf(FILE *fp, “输入格式描述串输入格式描述串”, 输入项地

20、址表列输入项地址表列) 函数功能:函数功能: 按照“输入格式描述串”所指定的格式,从文件fp的当前读写位置开始读取若干个数据,然后把数据按“输入项地址表列”的顺序存入指定的存储单元中参数说明:参数说明: fp为文件指针,“输入格式描述串”与scanf()函数中的输入格式描述串相同,“输入项地址表列”为从指定文件中读入数据的存放地址,各输入项之间用逗号分隔。 返回值:返回值:函数返回值为所输入的数据个数,如果遇到文件结束符时,返回值为EOF,此时feof(fp)为真。7.3.1 文文本文件的顺序读写本文件的顺序读写 格式化输出函数格式化输出函数fprintf( )fprintf( )原型:原型:

21、 int fprintf(FILE *fp, “输出格式描述串输出格式描述串”, 输出项表列输出项表列) 函数功能:函数功能: 按照“输出格式描述串”中所指定的格式,依次把“输出项表列”中的各项数据写入文件fp 参数说明:参数说明: fp是文件类型指针,它指向输出的文件;“输出格式描述串”为给定的输出格式,与print()函数的输出格式描述串相同返回值:返回值:正常返回值为输出的数据个数,如果出错,则返回EOF值。 例例7.67.6 学生基本信息包括学号、三门课的单科成绩和三门课的平均分。要求创建一 个 名 为stu.txt的文本文件,把从键盘上输入数据全部按照格式化写的形式输出到文本文件中去

22、。 7.3.1 文文本文件的顺序读写本文件的顺序读写例例7.67.6运行示范 7.3.1 文文本文件的顺序读写本文件的顺序读写 例例7.77.7学生基本信息同例7.6,要求把例7.6中创建的文件按照格式化读的形式显示在屏幕上。 例例7.87.8假设学生的数据信息已经按照平均分从高到低的顺序,保存在一个名为sorted.txt的文本文件中了。现在从键盘上输入另一个新生的基本信息,要求在文件中插入新记录,并且仍然要保持原来的有序性。 7.3.27.3.2 二进制文件的顺序读写二进制文件的顺序读写数据块输入函数数据块输入函数freadfread( ) ( ) 函数原型函数原型:int fread(v

23、oid *buffer, unsigned size, unsigned number, FILE *fp) 函数功能函数功能: 从fp所指定的文件中以二进制形式读取数据块 参数说明参数说明: 参数buffer为指针变量,用于指向某个存储区的首地址,参数size为一次读入的字节数,参数number为读操作的次数;参数fp为文件指针 返回值返回值: 函数正常调用后返回值为参数number的值,如果遇到文件结束(或者发生读数错误)时,返回值为0 7.3.27.3.2 二进制文件的顺序读写二进制文件的顺序读写例例:fread(address, 4, 5, fp);表示从fp文件中前后反复读取5次数据

24、,每次读取的数据为4个字节,所有这些数据被保存到存储区address中。例例:struct student int number; char name20;stud30;for(i=0; i30; i+) fread(&studi, sizeof(struct student), 1, fp);通过循环从fp文件中读取30个学生的基本信息,每调用一次fread()函数将读出一个学生的信息,所有这些信息都被保存在一个名为stud的结构数组中7.3.27.3.2 二进制文件的顺序读写二进制文件的顺序读写 运算符运算符sizeofsizeof用来返回某个表达式(或者某种数据类型)的字节数,使

25、用格式如用来返回某个表达式(或者某种数据类型)的字节数,使用格式如下:下: sizeof(sizeof(表达式表达式) ) 或者或者 sizeof(sizeof(数据类型名数据类型名) )例例7.97.9 运算符sizeof使用示例。 7.3.2 二进制文件的顺序读写数据块输出函数数据块输出函数fwrite( )fwrite( )函数原型函数原型:int fwrite(const void *buffer, unsigned size, unsigned number, FILE *fp) 函数功能函数功能: 将保存在buffer存储区中的数据以二进制的形式写入fp文件 参数说明参数说明: 参

26、数buffer为指针变量,它指向某个存储区的首地址,参数size为要输出的字节数,参数number表示写操作的次数,参数fp用来指定输出文件 返回值返回值: 函数正常调用返回值为number的值,如果文件输出结束或出错时,则返回值为0 7.3.27.3.2 二进制文件的顺序读写二进制文件的顺序读写例:struct student int number; char name20;stud30;for(i=0; i30; i+) fwrite(&studi,sizeof(struct student),1,fp); 假设30个学生的基本信息都已经保存在结构数组stud中,通过循环每次调用f

27、write()函数,就把全部数组元素写到文件fp中去了 例例7.107.10 从键盘上输入10个实数,以二进制的形式存入一个名为ten.dat的文件中。 (接下页) 例例7.107.10 从键盘上输入10个实数,以二进制的形式存入一个名为ten.dat的文件中。 (接上页) 例例7.117.11学生基本信息包括学号、三门课的单科成绩和平均分。从键盘上输入数据,要求创建一个名为stud.bin的二进制文件例例7.117.11运行结果示范运行结果示范字输入函数getw()函数原型函数原型:int getw(FILE int getw(FILE * *fp)fp)函数功能函数功能: 从fp指定的文件

28、中以二进制的形式读取一个字(word)参数说明参数说明: fp为文件指针返回值返回值: 正常返回值为所读取的二进制整数。若碰到文件结束或者读写错误这两种情况,则返回值为EOF例:i=getw(fp);i=getw(fp); 从fp文件中读取一个整数,将其保存到变量i中字输出函数putw()函数原型函数原型:int putw(int n, FILE int putw(int n, FILE * *fp)fp) 函数功能函数功能: 以二进制形式将一个int型的数据写到fp所指定的文件中去 参数说明参数说明: n为要写到fp所指定文件中的整数,fp为文件指针 返回值返回值:正常返回的值为输出的整数n

29、,非正常返回值为EOF例:putw(10, fp); 把整数10写到fp所指定的文件中去 7.47.4 文件的定位与随机读写文件的定位与随机读写7.4.1 rewind()函数函数 函数原型函数原型:void rewind(FILE *fp) 函数功能函数功能: 将文件的读/写位置指针重新指向文件的开头 参数说明参数说明: fp为文件指针 返回值返回值: 无返回值7.4.1 rewind()函数函数例例7.127.12 rewind()rewind()函数使用举例。本例用来实现两个文件的复制,源函数使用举例。本例用来实现两个文件的复制,源文件名为文件名为file1.datfile1.dat,目

30、标文件名为,目标文件名为file2.datfile2.dat。 7.4.2 fseek()函数函数 函数原型函数原型: int fseek(FILE *fp,long offset, int whence) 函数功能函数功能: 把文件fp的读写位置指针调整到相对whence来说是offset的地方 7.4.2 fseek()函数函数下面是几个调用fseek( )函数的例子:fseek(fp,10L,SEEK_SET); 将位置指针移动到离文件头10个字节位置fseek(fp,20L,1); 将位置指针移到离当前位置20个字节的位置fseek(fp,-50L,2); 将位置指针移到距离文件末尾5

31、0个字节的位置 例例7.137.13 学生基本信息包括学号、三门课的单科成绩和平均分。在例7.11中这些数据已经保存在一个名为stud.bin的二进制文件中了。 现在想对个别学生的成绩进行更正,根据键盘输入的学号来修改文件中原有的数据。7.4.3 ftell()函数函数 函数原型函数原型:long ftell(FILE *fp) 函数功能函数功能: 该函数用于取得流式文件当前的读写位置,它是用相对于文件开头位移量来表示该位置的参数说明参数说明: fp为文件指针 返回值返回值: 正常返回值为位移量,返回值为-1表示出错 7.4.3 ftell()函数函数例: n=ftell(fp); if(n=-1)printf(“7 Error!

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论