1.1k likes | 1.19k Views
第 12 章 文件. 12.1 文件的基本概念. 12.1 文件的基本概念. 所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名 称,叫做文件名。实际上在前面的各章中我们已经多次使用了文件。 例如,源程序文件、目标文件、可执行文件、库文件 ( 头文件 ) 等。文 件通常是驻留在外部介质 ( 如磁盘等 ) 上的,在使用时才调入内存中来 。从不同的角度可对文件作不同的分类。从用户的角度看,文件可分 为普通文件和设备文件两种。普通文件是指驻留在磁盘或其它外部介 质上的一个有序数据集,可以是源文件、目标文件、可执行程序;也
E N D
12.1 文件的基本概念 • 所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名 • 称,叫做文件名。实际上在前面的各章中我们已经多次使用了文件。 • 例如,源程序文件、目标文件、可执行文件、库文件(头文件)等。文 • 件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来 • 。从不同的角度可对文件作不同的分类。从用户的角度看,文件可分 • 为普通文件和设备文件两种。普通文件是指驻留在磁盘或其它外部介 • 质上的一个有序数据集,可以是源文件、目标文件、可执行程序;也 • 可以是一组待输入处理的原始数据,或者是一组输出的结果。
12.1 文件的基本概念 • 对于源文件、目标文件、可执行程序可以称作程序文件,对输入/ • 输出数据可称作数据文件。设备文件是指与主机相联的各种外部设备 • ,如显示器、打印机、键盘等。在操作系统中,把外部设备也看作是 • 一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和 • 写。通常把显示器定义为标准输出文件,一般情况下在屏幕上显示有 • 关信息就是向标准输出文件输出,如前面经常使用的printf(), • putchar()函数就是这类输出。键盘通常被指定为标准的输入文件,从 • 键盘上输入就意味着从标准输入文件上输入数据。scanf(),getchar()函 • 数就属于这类输入。
12.1 文件的基本概念 • 12.1.1 文件的分类 • 在C语言中,文件常被看作是字符(或字节)的序列,即文件是 • 由一个个的字符(或字节)按一定的顺序组成的,这里的字符(或字 • 节)序列称之为字节流。文件以字节为单位进行处理,并不区分类型 • ,这样能增强数据处理的灵活性,输入/输出字节流的开始和结束只受 • 程序的控制而不受物理符号(如回车换行符)的限制,通常也把这种 • 文件称为流式文件。
12.1 文件的基本概念 • 根据数据存储的形式,C语言中的文件可以分为文本文件和二进 • 制文件两种。以ASCII码字符形式存储的文件称为文本文件,又叫 • ASCII文件。在文本文件中,存储一个文件需要一个字节,虽然此时 • 处理字符比较方便,但文本文件一般占用较大的存储空间。文本文 • 件的种类很多,譬如上机时使用高级程序设计语言自带的编译器编 • 写而成的源程序文件就是文本文件,如C语言中的所有的源程序文件 • (扩展名为.c的文件);在Windows 98/2000/XP中,使用“附件”程序 • 组下的“记事本”创建出来的文件也是文本文件。但是Microsoft Word • 编辑的Word文档(其扩展名为.doc的文档)却不是文本文件,这点 • 需要区别。
12.1 文件的基本概念 • 文件的另一种存储形式是二进制文件。在二进制文件中,数据以 • 二进制的形式存储的,结构紧凑利于节省大量的存储空间。譬如,C • 语言中的目标文件(扩展名为.obj)和可执行文件(扩展名为.exe)都 • 是二进制文件。在二进制文件中,一个字节并不直接对应一个字符, • 它需要转换后才能以字符的形式输出。不过,当从二进制文件中读取 • 数据时,无需转换就可以直接将数据读入内存,提高了文件的输出速 • 度。 • 例如,数5678的存储形式为: • ASCII码: 00110101 00110110 00110111 00111000 • ↓ ↓ ↓ ↓ • 十进制码: 5 6 7 8
12.1 文件的基本概念 • 共占用4个字节。ASCII码文件可在屏幕上按字符显示,例如,源 • 程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。由于 • 是按字符显示,因此能读懂文件内容。 • 二进制文件是按二进制的编码方式来存放文件的。 • 例如,数5678的存储形式为: • 00010110 00101110 • 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无 • 法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流 • ,按字节进行处理。输入/输出字符流的开始和结束只由程序控制而不 • 受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。
12.1 文件的基本概念 • 从用户的角度分,文件可分为普通文件和设备文件。普通文件是指存储在外部介质上的数据的集合,可以是源程序文件、目标文件、可执行文件;也可以是一组待输入处理的原始数据,或者是一组输出的结果。对于源程序文件,目标文件、可执行文件称作程序文件,对于输入或输出数据称作数据文件。设备文件是指与主机相连接的各种外部设备,如显示器、打印机、键盘等。在操作系统中,把外部设备作为一个文件来进行管理,把通过它们进行的输入输出等同于对文件的读写。
12.1 文件的基本概念 • 从文件的读写方式分,文件可分为顺序读写文件和随机读写文件 • 。顺序读写文件,是指按从头到尾的顺序读出或写入的文件。例如, • 从一个学生成绩的数据文件中读取数据时,顺序存取方式必然先读取 • 第一个学生的数据,再读取第二个学生的数据,…,而不能随意读取 • 所需要的某个学生的数据。随机读写文件,是指可以读写文件中任意 • 所需要的字符。
12.1 文件的基本概念 • 12.1.2 文件操作过程 • 通过程序对文件进行操作,实现从文件中读取数据或向文件中写 • 入数据,一般步骤如下: • (1)建立或打开文件。 • (2)从文件中读取数据或向文件中写入数据。 • (3)关闭文件。 • 上述文件处理的3个步骤和日常生活当中看书的过程相似。假设 • 看书之前书本是合上的,如果想看书,则必须首先打开书本;接下来 • 在看书过程中即可以阅读,也可以做读书笔记,就相当与对文件进行 • 读/写操作;书读完会把书合上。这里的3个步骤是按照顺序执行的, • 所以,打开文件是对文件进行读写的前提。打开文件就是将指定文件 • 与程序联系起来,为文件的读写作好准备。当为进行写操作打开一个
12.1 文件的基本概念 • 文件时,如果文件不存在,则系统会先建立这个文件。当为进行读 • 操作打开一个文件时,该文件是已经存在的文件,否则会出错。 • 数据文件可以通过文本编辑程序建立,如同建立源程序文件一 • 样。也可以是其它程序写操作生成的文件。 • 从文件中读取数据,就是从指定文件中读取数据,存入程序在 • 内存中的数据区,如变量或数组中。 • 向文件中写入数据,就是将程序的输出结果存入指定文件中, • 即文件名所对应的外存储器的存储区中。 • 12.1.3 文件缓冲区
12.1 文件的基本概念 • 文件的写操作是将程序的输出结果,即某个变量或数组的内容写到文件中。而实际上,在计算机系统中,数据先是从内存中的程序数据区输出到内存中的缓冲区暂存,当该缓冲区装满后,数据才被整块送到外存储器的文件中。 • 例如,当系统要向磁盘文件输出数据时,先将数据送到缓冲区,待装满缓冲区后才一起把数据输出给磁盘文件。如图12.1所示
12.1 文件的基本概念 • 相反,当系统要从磁盘文件输入数据时,也是先将数据送到缓冲区,待装满缓冲区后才一起把数据输入到内存中。 • 文件缓冲区是内存中的一块区域,用于进行文件读写操作时数据的暂存,缓冲区的大小一般因为机器的不同而不同。设立文件缓冲区可以提高效率,和内存相比,磁盘的存取速度很慢,如果读写一个数据就和磁盘直接打交道,那么即是CPU的速率很高,整个程序的执行效率也会大大降低。显然,有了文件缓冲区可以减少磁盘读写次数,从而提高程序的效率。
12.2 文件类型指针 • 本章讨论流式文件的打开、关闭、读、写、定位等各种操作。文件指针在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。 • 定义说明文件指针的一般形式为:FILE* 指针变量标识符;其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程序时不必关心FILE结构的细节。
12.2 文件类型指针 • 例如:FILE *fp; • 表示fp是指向FILE结构的指针变量,通过fp 即可找存放某个文件 • 信息的结构变量,然后按结构变量提供的信息找到该文件,实施对文 • 件的操作。习惯上也笼统地把fp称为指向一个文件的指针。文件的打 • 开与关闭文件在进行读写操作之前要先打开,使用完毕要关闭。所谓 • 打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该 • 文件,以便进行其它操作。关闭文件则断开指针与文件之间的联系, • 也就是禁止再对该文件进行操作。
12.3 文件的打开与关闭 • C语言并不是直接通过文件名对文件进行操作,而是首先创建一 • 个和文件关联的文件指针变量,然后通过文件指针变量操作文件。因 • 此,文件在进行读/写操作之前首先打开,使用完要关闭。所谓打开文 • 件,实际上是建立文件的各种相关信息,并使文件指针指向该文件, • 以便进行其他操作。关闭文件则是断开指针与文件之间的联系,也就 • 是禁止再对文件进行操作。 • 在C语言中,文件操作都是由库函数来完成的。在本章内将介绍 • 主要的文件操作函数。
12.3 文件的打开与关闭 • 12.3.1 文件打开函数fopen • 使用文件之前要打开文件,打开文件完成以下工作: • (1)在外部设备中找到或创建指定的文件。 • (2)在内存中为文件建立缓冲区。 • (3)建立文件变量。 • (4)确定文件的使用方式。 • 在C语言中,用fopen函数来打开一个文件,其调用的一般形式为: • 文件指针名=fopen(文件名,使用文件方式) • 其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件 • 名”是被打开文件的文件名。“使用文件方式”是指文件的类型和操作要 • 求。“文件名”是字符串常量或字符串数组。
12.3 文件的打开与关闭 • 例如: • FILE *fp; • fp=(“file1”,“r”); • 其意义是在当前目录下打开文件file1,只允许进行“读”操作,并使fp • 指向该文件。 • 又如: • FILE *fphzk; • fphzk=(“c:\\hzk16”,“rb”); • 其意义是打开C驱动器磁盘的根目录下的文件hzk16,这是一个二进制 • 文件,只允许按二进制方式进行读操作。两个反斜线“\\”中的第一个 • 表示转义字符,第二个表示根目录。使用文件的方式共有12种,表12- • 1给出了它们的符号和意义。
12.3 文件的打开与关闭 • 文件打开函数fopen有其需要注意的以下几点: • (1)文件使用方式由r,w,a,t,b,+六个字符拼成,各字符 • 的含义是: • r(read):读 • w(write):写 • a(append):追加 • t(text):文本文件,可省略不写 • b(banary):二进制文件 • +:读和写 • (2)凡用“r”打开一个文件时,该文件必须已经存在,且只能从 • 该文件读出。 • (3)用“w”打开的文件只能向该文件写入。若打开的文件不存在 • ,则以指定的文件名建立该文件,若打开的文件已经存在,则将 • 该文件删去,重建一个新文件。
12.3 文件的打开与关闭 • (4)若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件。但此时该文件必须是存在的,否则将会出错。 • (5)在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此,常用以下程序段打开文件: • if((fp=fopen("c:\\hzk16","rb")==NULL) /* 打开文件失败 */ • { printf("\nerror on open c:\\hzk16 file!"); • getch(); • exit(1); /* 退出程序 */ • } • 这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“error on open c:\ hzk16file!”,下一行getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任一键时,程序才继续执行,因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。
12.3 文件的打开与关闭 • (6)把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。
12.3 文件的打开与关闭 • (7)标准输入文件(键盘),标准输出文件(显示器),标准出错输出(出错信息)是由系统打开的,可直接使用。文件关闭函数fclose(),文件一旦使用完毕,应用关闭文件函数把文件关闭,以避免文件的数据丢失等错误。下面给出一个例子: • 以写方式打开一个在C盘下的名字为test.txt的文本文件。 • void main() • { FILE *fp; • if((fp=fopen("c:\\test.txt","w"))==NULL) /* 打开文件失败 */ • { printf("Can not open file\n"); /* 显示文件不能打开信息 */ • exit(1); /* 退出程序 */ • } • fclose(fp); /* 关闭文件 */ • } • 上例中的if语句是打开文件的常用方法,如果文件打开失败,此时fopen函数返回NULL指针,这时应该给出相关提示并作相关处理。例中并不是直接给出文件名,而是给出了文件所在的完整路经,注意前面讲过如果字符中出现“\”,应该用转义字符号“\\”表示。
12.3 文件的打开与关闭 • 12.3.2 文件的关闭函数fclose • 关闭文件就是指文件使用完毕后使原来指向文件的文件类型不在指向该文件,从而防止该文件在使用完毕后被误用。 • 与文件打开操作相对应,文件使用之后应关闭。关闭文件完成以下工作。 • (1)如果文件以“写”或“读写”方式打开,则把缓冲区中未存入文件的数据存储到文件中,并在文件末尾加入文件结束符-1。 • (2)解除文件指针变量与文件关联,文件指针变量可另作它用。
12.3 文件的打开与关闭 • (3)释放文件缓冲区。 • 在C语言中,用fclose()函数来关闭一个文件,其调用的一般形式为: • fclose(文件指针); • 例如:fclose(fp); • 其作用是关闭fp所指向的文件。正常完成关闭文件操作时,fclose函数返回值为0。如返回非零值则表示有错误发生。文件的读写对文件的读和写是最常用的文件操作。
12.4 文件的读写 • 对文件的读/写是最常用的文件操作,在C语言中提供了多种文件 • 读/写的函数,读/写文本文件和读/写二进制文件所使用的函数是不同 • 的,下面将分别介绍。打开文件后,就可以从文件读取数据或者将数 • 据写入文件了,文件的读写包括有字符、字符串、数据块、格式化等 • 。函数表示如下: • 字符读写函数:fgetc和fputc(getc和putc函数) • 字符串读写函数:fgets和fputs • 数据块读写函数:freed和fwrite • 格式化读写函数:fscanf和fprinf • 使用以上函数都要求包含头文件stdio.h。字符读写函数fgetc和 • fputc是以字符(字节)为单位的读写函数。每次可从文件读出或向文件 • 写入一个字符。
12.4 文件的读写 • 12.4.1 文件的写函数 • 1.字符写函数fputc() • 函数调用的一般形式为: • fputc(字符量,文件指针); • fputc()函数的功能是把一个字符写入指定文件的当前位置处,然 • 后将该文件的位置指示器植移到下一个位置,其中,待写入的字符量 • 可以是字符常量或字符变量。例如:fputc(‘a’,fp);其意义是把字符a写 • 入fp所指向文件的当前位置处。 • fputc()函数有返回值,若写操作成功,则返回一个向文件所写字 • 符的值;否则返回EOF(文件结束标志,其值为-1,在stdio.h中定义) • ,表示写操作失败。
12.4 文件的读写 • 使用fputc函数时需要注意以下几点: • (1)被写入的文件可以用写、读写、追加方式打开,用写或读写 • 方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文 • 件首开始。如需保留原有文件内容,希望写入的字符以文件末开始存 • 放,必须以追加方式打开文件。被写入的文件若不存在,则创建该文 • 件。 • (2)每写入一个字符,文件内部位置指针向后移动一个字节。 • (3)fputc()函数有一个返回值,如写入成功则返回写入的字符, • 否则返回一个EOF。可用此来判断写入是否成功。
12.4 文件的读写 • 例12.1 输入5行字符,将其写入到C盘根目录的myfile.txt文件中。 • #include <stdio.h> • void main() • { FILE *fp; • char ch[80],*p=ch; • int n; • if((fp=fopen("c:\\myfile.txt","w"))==NULL) /* 打开文件失败 */ • { printf("Cannot open the exit!"); • exit(1); /* 退出程序 */ • } • printf("input a string:\n"); • for(n=1;n<=5;n++) • { gets(p); /* 输入一行字符 */
12.4 文件的读写 • while(*p!='\0') /* 逐个字符写入文件 */ • { fputc(*p,fp); • p++; • } • fputc('\n',fp); /* 写入换行符 */ • } • fclose(fp); /* 关闭文件 */ • } • 程序中通过gets()读入一个字符,逐个字符写入文件中,在写完一行后,使用fputc('\n',fp);语句换行,否则各行写在一起。
12.4 文件的读写 • 2.写字符串函数fputs() • 函数调用的一般形式为: • fputs(字符串,文件指针); • fputs()函数的作用是向指定的文件写入一个字符串,其中字符串可以是字符串常量,也可以是字符数组名,或指针变量。 • 例如: • fputs(“abcd”,fp); • 其意义是把字符串“abcd”写入fp所指的文件之中。写操作成功,函数返回0,写操作失败,返回非0。
12.4 文件的读写 • 例12.2 使用函数fputs()改写例12.1。 • #include <stdio.h> • void main() • { FILE *fp; • char ch[80],*p=ch; • int n; • if((fp=fopen("c:\\myfile.txt","w"))==NULL) /* 打开文件失败 */ • { printf("Cannot open the exit!"); • exit(1); /* 退出程序 */ • } • printf("input a string:\n"); • for(n=1;n<=5;n++) • { gets(p); /* 输入一行字符 */ • fputs(p,fp); /* 写入该行字符 */ • fputc('\n',fp); /* 写入换行符 */ • } • fclose(fp); /* 关闭文件 */ • }
12.4 文件的读写 • 3.格式化写函数fprintf() • 把格式化的数据写到文件中,其中格式化的规定与printf()函数相同,所不同的只是fprintf()函数是向文件中写入,而printf()函数是向显示器输出。 • 函数调用的一般形式为: • fprintf(文件指针,格式字符串,输出表列); • 例如: • fprintf(fp, “%d%c”,j,ch); • 其返回值为实际写入文件中的字符个数(字节数);如果写错,则返回一个负数。
12.4 文件的读写 • 例12.3 随机产生20个[10,99]的整数,以每行5个数据输出到文本文件c:\data.txt中,要求每个数据占5个宽度,并且数据之间用逗号分隔。 • #include <stdio.h> • #include <stdlib.h> /* 包含初始化随机产生种子数randomize() */ • void getdata(int a[],int n) • { int i; • randomize(); /* 初始化随机产生种子数 */ • for(i=0;i<n;i++) • a[i]=(rand()%90)+10; /* 产生[10,99]的随机整数 */ • }
12.4 文件的读写 • void putdata(int a[],int n) • { int i; • FILE *fp; • if((fp=fopen("c\\data.txt","w"))==NULL) /* 打开文件失败 */ • { printf("Cannot open the file exit!"); • exit(1); /* 退出程序 */ • } • for(i=0;i<n;i++) • { if(i%5==0) • fprintf(fp,"%5d",a[i]); /* 每一行的第1个数据前不用逗号 */ • else • fprintf(fp,",%5d",a[i]); • if((i+1)%5==0) /* 每一行输出5个数据换行 */ • fprintf(fp,"\n"); • } • fclose(fp); /* 关闭文件 */ • }
12.4 文件的读写 • void main() • { int a[20]; • getdata(a,20); • putdata(a,20); • }
12.4 文件的读写 • 4.写数据块函数fwrite() • C语言还提供了用于整块数据的写函数fwrite()。可用来写一组数 • 据,如一个数组、一个结构变量的值。写数据快函数调用的一般形式 • 为:fwrite(buffer,size,count,fp); • 其中,buffer是一个指针,在fread()函数中,它表示存放输入数据 • 的首地址。在fwrite()函数中,它表示存放输出数据的首地址。size表 • 示数据块的字节数。count表示要读写的数据块块数。fp表示文件指针 • ,随着所写字符的增加,文件位置指示器将自动下移。如果所写的个 • 数少于所要求的,就表示发生了错误。 • 函数fwrite()常常用于对二进制文件进行写操作。例如,设有定义: • int xa[10]={1,2,3,4,5,6,7,8,9,10};则使用函数fwrite()将数组整体写入文 • 件中的语句为:fwrite(xa,20,1,fp); 其意义是:从数组xa的首地址开始 • ,一次将20个字节(一个整数为2个字节)写入大到fp所指的文件中。
12.4 文件的读写 • 例12.4 从键盘输入5个学生数据,写入一个文件中。程序如下: • #include <stdio.h> • struct student • { char name[10]; • int num; • int age; • char addr[15]; • }stu[5],*pp /* 定义学生信息结构体类型 */ • void main() • { FILE *fp; • char ch; • int i; • pp=stu; /* 指针变量pp指向学生结构数组stu */
12.4 文件的读写 • if((fp=fopen("c:\\student.dat","wb"))==NULL) /* 打开文件失败 */ • { printf("Cannot open file strike any key exit!"); • getch(); /* 暂停 */ • exit(1); /* 退出程序 */ • } • printf("\ninput data\n"); • for(i=0;i<5;i++,pp++) /* 输入5个学生数据 */ • scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr); • pp=stu; • fwrite(pp,sizeof(struct stu),5,fp); • fclose(fp); /* 关闭文件 */ • }
12.4 文件的读写 • 本例程序定义了一个结构student,说明了1个有5个元素的结构 • 数组stu以及1个结构指针变量pp,程序中以读写方式打开二进制文 • 件“c:\\student.dat”,输入5个学生数据之后,写入该文件中。
12.4 文件的读写 • 12.4.2 文件的读函数 • 1.字符读函数fgetc() • 函数调用的一般形式为:字符变量=fgetc(文件指针); • fgetc()函数的功能是,从指定的文件中读一个字符,并送入左边的变 • 量中,并将文件的位置指示器移到下一个位置。 • 例如:ch=fgetc(fp);其意义是从打开的文件fp中读取一个字符并送入ch中,同时指针移向下一个位置。 • 对于fgetc()函数的使用有以下几点说明:
12.4 文件的读写 • (1)在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。 • (2)读取字符的结果也可以不向字符变量赋值。例如,fgetc(fp); 但是 • 读出的字符不能保存。 • (3)在文件内部有一个位置指针,用来指向文件的当前读写字节。在 • 文件打开时,该指针总是指向文件的第一个字节。使用fgetc()函数后, • 该位置指针将向后移动一个字节。因此可连续多次使用fgetc()函数,读 • 取多个字符。应注意文件指针和文件内部的位置指针不是一回事。文 • 件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值, • 文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当 • 前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义 • 说明,而是由系统自动设置的。
12.4 文件的读写 • 例12.5 从文件ex125.c中读入字符并在屏幕上显示输出。程序如下: • #include <stdio.h> • void main() • { FILE *fp; • char ch; • if((fp=fopen("ex121.c","rt"))==NULL) /* 打开文件失败 */ • { printf("Cannot open file strike any key exit!"); • getch(); /* 暂停 */ • exit(1); /* 退出程序 */ • } • ch=fgetc(fp); /* 从文件读取一个字符 */ • while(ch!=EOF) /* EOF为文件的结束标志 */ • { putchar(ch); /* 在屏幕上显示字符 */ • ch=fgetc(fp); /* 继续从文件读取一个字符 */ • } • fclose(fp); /* 关闭文件 */ • }
12.4 文件的读写 • 本例程序的功能是从文件中逐个读取字符,在屏幕上显示。程序定义了文件指针fp,以读文本文件方式打开文件“ex125.c”,并使fp指向该文件。如打开文件出错,给出提示并退出程序。程序第12行先读出一个字符,然后进入循环,只要读出的字符不是文件结束标志(每个文件末有一结束标志EOF)就把该字符显示在屏幕上,再读入下一字符。每读一次,文件内部的位置指针向后移动一个字符,文件结束时,该指针指向EOF。执行本程序将显示整个文件。
12.4 文件的读写 • 2.字符串读函数fgets() • 函数调用的一般形式为:fgets(字符数组名,n,文件指针); • 其作用是,从指定的文件中读一个字符串到字符数组中,其中的n • 是一个正整数。表示从文件中读出的字符串不超过n-1个字符。在读入 • 的最后一个字符后加上串结束标志‘\0’。例如:fgets(str,n,fp); 意义是从 • fp所指的文件中读出n-1个字符送入字符数组str中。 • 注意,fgets()函数从文件中读取字符直到遇见回车符或EOF为止, • 或直到读入了所限定的字符数(至多n-1个字符)为止。 • 例如:fgets(str,n,fp); • 其意义是从fp所指的文件中读出n-1个字符送入字符数组str中,并 • 在最后加上结束标志‘\0’。函数读成功返回str指针;失败则返回一个 • 空指针NULL。
12.4 文件的读写 • 例 12.6 从ex126.c文件中读入一个含10个字符的字符串。 • #include <stdio.h> • void main( ) • { FILE *fp; • char str[11]; • if((fp=fopen("e126.c","rt"))==NULL) /* 打开文件失败 */ • { printf("Cannot open file strike any key exit!"); • getch(); /* 暂停 */ • exit(1); /* 退出程序 */ • } • fgets(str,11,fp); /* 从文件读取一个字符串 */ • printf("%s",str); /* 输出到显示器上 */ • fclose(fp); /* 关闭文件*/ • }