c语言教程(课件)第9章.ppt
《c语言教程(课件)第9章.ppt》由会员分享,可在线阅读,更多相关《c语言教程(课件)第9章.ppt(44页珍藏版)》请在三一文库上搜索。
1、第十三讲 文件,C文件概述 文件类型指针 文件的打开与关闭 文件的读写 文件的定位 出错的检测 非缓冲文件系统 文件输入输出小结,C文件概述,文件(file)一般指:存储在外部介质上数据的集合。数据是以文件的形式存放在外部介质(如磁盘)上的,操作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。 C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成.根据数据的组织形成,可分为ASCII文件和二进制文件。AS
2、CII文件又称文本(text)文件,它的每一个字节放一个ASCII代码,代表一个字符.二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。,ASCII形式和二进制形式输出的不同: 例: 如果有一个整数10000,在内存中占2个字节,如果按 ASCII形式输出,则占5个字节,而按二进制形式输出,在 磁盘上只占2个字节.如下图所示:,00100111 00010000,00100111 00010000,00110001 00110000 00110000 00110000 00110000,ASCII形式,(1) (0) (0) (0) (0),二进制形式,由前所述,一个C文件
3、是一个字节流或二进制流。它把数据看作是一连串的字符(字节),而不考虑记录的界限,即C中文件并不是由记录(record)组成的。在C中对文件的存取是以字符(字节)为单位的,输入/输出数据流的开始和结束仅受程序控制而不受物理符号控制,我们把这种文件称为流式文件。,流式文件的形式:,文件的处理方法,旧C版本有两种对文件的处理方法: 一.缓冲文件系统:,数据程序区,输出文件缓冲区,输入文件缓冲区,输出,输入,输出,输入,磁盘,所谓缓冲文件系统是指,系统自动地在内存区为每一个正在使用的文件名开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去;从磁盘向内存读入数据,
4、也是一次从磁盘文件将一批数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)。缓冲区的大小由各个具体的C版本确定,一般为512字节。,二.非缓冲文件系统: 所谓“非缓冲文件系统”是指系统不 自动开辟确定大小的缓冲区,而由程 序为每个文件设定缓冲区。 在UNIX系统中,用缓冲文件系统来处理文本文件,用非缓冲文件系统处理二进制文件。用缓冲文件系统进行的输入/输出又称为高级输入/输出系统,用非缓冲文件系统进行的输入输出又称为低级输入/输出系统。 T只采用缓冲文件系统,即既用缓冲文件系统处理文本文件,也用它来处理二进制文件。,文件类型指针,缓冲文件系统中,关键的概念是“文件指针
5、”。每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息(如文件的名字,文件状态及文件当前位置等)。这些信息是保存在一个结构体类型变量中的,该结构体类型由系统定义,取名为FILE。一般的C中,在stdio.h文件中有以下的类型定义: typedef struct int _fd; /*文件号*/ int _cleft; /*缓冲区中剩下的字符*/ int _mode; /*文件操作模式*/ char *_nextc; /*下一个字符位置*/ char *_buff; /*文件缓冲区位置*/ FILE;,有了FILE类型之后,可以用它来定义若干FILE类型的变量,以便存放若干个文件的信
6、息。例如, 可以定义文件型指针变量,如 FILE *fp; fp是一个指向FILE类型结构体的指针变量,可以使fp指向一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件,也就是说,通过文件指针变量能够找到与它相关的文件。如果有n个文件,一般应设n个指针(指向FILE类型结构体的指针变量),使它们分别指向n个文件(确切地说,指向该文件的信息结构体),以实现对文件的访问。,文件的打开(fopen函数),与其它高级语言一样,对文件读写之前应该“打开”该文件,在使用结束之后应关闭该文件。 fopen函数的调用方式为: FILE *fp; fp=fopen(文件名,使用文件方式); 例
7、如: fp=fopen(“A1”,”r”) 它表示:要打开名字为A1的文件,使用文件方式为“读入”,fopen函数带回指向A1文件的指针并赋给fp,这样fp就和A1相联系了,或者说,fp指向A1文件。,可以看出,在打开一个文件时,通知给编译系统以下三个信息: (1)需要打开的文件名,也就是准备访问的文件的 名字。 (2) 使用文件的方式(读还是写等)。 (3) 让哪一个指针变量指向被打开的文件。,文件使用方式 含义 “r” (只读) 为输入打开一个文本文件 “w” (只写) 为输出打开一个文本文件 “a” (追加) 向文本文件尾增加数据 “rb” (只读) 为输入打开一个二进制文件 “wb”
8、(只写) 为输出打开一个二进制文件 “ab” (追加) 向二进制文件尾增加数据 “r+” (读写) 为读/写打开一个文本文件 “w+” (读写) 为读/写建立一个新的文本文件 “a+” (读写) 为读/写打开一个文本文件 “rb+” (读写) 为读/写打开一个二进制文件 “wb+” (读写) 为读/写建立一个新的二进制文件 “ab+” (读写) 为读/写打开一个二进制文件,使用文件方式如下表:,说明,1.用“ r ”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据。而且该文件应该已经存在,否则出错。 2.用“ w ”方式打开的方式只能用于向该文件写数据,而不能用来向计算机输入。如果
9、原来不存在该文件,则在打开时新建立一个以指定名字命名的文件;如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立一个新文件。 3.如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“ a ”方式打开。若该文件不存在,则先建立该文件。 4.用“r+”,”w+”,”a+”方式打开的文件可以用来输入和输出数据。,5.如果不能实现“打开”的任务,fopen函数将会带回一个出错信息,出错的原因可能是:用“ r ”方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等.此时fopen函数将带回一个空指针值NULL (NULL在stdio.h文件中已被定义为0)
10、。 常用下面的方法打开一个文件: if (fp=fopen(“file1”,“r”)= =NULL) printf(“cannot open this filen”); exit ( 0 ); 即先检查打开有否出错,如果有错就在终端上输出“cannot open this file”,exit函数的作用是关闭所有文件,终止正调用的过程。待程序员检查出错误,修改后再运行。,6.在读写文本文件时,将回车和换行符转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。二进制文件则不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一至,一一对应. 7.在程序开始运行时,系统自动打
11、开三个标准文件:标准输入,标准输出,标准出错输出。通常这三个文件都与终端相联系.系统自动定义了三个文件指针stdin,stdout和 stderr,分别指向终端输入,终端输出和标准出错输出(也从终端输出)。如果程序中指定要从要stdin所指的文件输入数据,就是指从终端键盘输入数据.,文件的关闭(fclose函数),“关闭”就是使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对其相连的文件进行读写操作,除非再次打开,使指针变量重新指向该文件。 fclose函数调用的一般形式为: fclose (文件指针); 例如: fclose (fp); 用fopen函数打开
12、文件时所带回的指针赋给了fp,今把该文件关闭。 应该养成在程序终止之前关闭所有使用的文件的习惯,如果不关闭文件将会丢失数据。 fclose 函数也带回一个值:当顺利地执行了关闭操作,则返回值为0;如果返值为非零值,则表示关闭时有错误.可以用ferror函数来测试。,fputc函数和fgetc函数,也称putc函数和getc函数. 一、fputc函数把一个字符写到磁盘文件上去,其一般形式为 fputc ( ch, fp ); 其中ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。fp是文件指针变量,它从fopen函数得到返回值。 fputc函数也带回一个值:如果输出成功则返回值就是
13、输出的字符:如果输出失败,则返回一个EOF。EOF是在stdio.h文件中定义的符号常量,值为-1。,二、fgetc函数 从指定文件读入一个字符,该文件必须是以读或读写方式打开的.fgetc函数的调用形式为 ch=fgetc ( fp ); fp为文件型指针变量,ch 为字符变量,fgetc函数带回一个字符,赋给ch.如果在执行fgetc读字符时遇到文件结束符,函数返回一个文件结束标志EOF。如果想从一个磁盘文件顺序读入所有字符并在屏幕上显示出来,可以: ch=fgetc ( fp ); while(ch!=EOF) putchar(ch); ch=fgetc(fp); ,TC提供一个feof
14、函数来判断文件是否真的结束。如果是文件结束,函数feof(fp)的值为1(真),否则为0(假). 如果想顺序读入一个二进制文件中的数据,可以用: while(!feof(fp) c=fgetc(fp); . 注意: 这种方法也适用于文本文件。,例L9-1: 从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“#”为止。 例L9-2: 文件复制。 本程序是按文本文件方式处理的,也可以用此程序来复制一个二进制文件,只需将两个fopen函数中的“r”和“w”分别改为“rb”和”wb”即可。 例L9-2-2: 用命令行参数进行文件复制。(可在DOS命令行状态下运行,相当于copy命令。),fre
15、ad函数和fwrite函数,用getc和putc函数可以用来读写文件中的一个字符。但是常常要求一次读入一组数据(例如,一个实数或一个结构体变量的值),ANSI C 标准提出设置两个函数(fread和fwrite),用来读写一个数据块.它们的一般调用形式为: fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 其中: buffer: 是一个指针.对fread来说,它是读入数据的存放地址. 对fwrite来说,是要输出数据的地址(以上指的是起 始地址) size: 要读写的字节数. count: 要进行读写多少个size字节的数据项
16、. fp: 文件型指针.,如果文件以二进制形式打开,用fread和fwrite函数就可以读写任何类型的信息,如: fread(f,4,2,fp); 其中f是一个实型数组名.一个实型变量占4个字节.这个函数从fp所指向的文件读入2次(每次4个字节)数据,存储到数组f中. 如果有一个如下的结构体类型: struct student-type char name10; int num; int age; char addr30; stud40; /*每一个元素用一存放一个学生的数据*/,假设学生的数据已存放在磁盘文件中,可以用下面的for语句和fread函数读入40个学生的数据: for(i=0;i
17、40;i+) fread( 如果fread或fwrite调用成功,则函数返回值为count的值,即输入或输出数据项的完整个数。 注意: fread和fwrite函数一般用于二进制文件的输入输出.因为它们是按数据块的长度来处理输入输出的,在字符发生转换的情况下很可能出现与原设想的情况不同.,例题分析,例L9-3: 从键盘输入n个学生的有关数据,然后把它们转存到磁盘文件上去。 例L9-3-2: 从文件中读所有学生的有关数据,显示在屏幕上。 例L9-3-3: 向文件中中追加学生数据。 例L9-4统计文件中单词的个数。,fgets函数和fputs函数 fgets的作用是从指定文件读入一个字符串,如 f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 教程 课件
链接地址:https://www.31doc.com/p-2142837.html