《C语言程序设计与数据结构》课件第10章.ppt
《《C语言程序设计与数据结构》课件第10章.ppt》由会员分享,可在线阅读,更多相关《《C语言程序设计与数据结构》课件第10章.ppt(43页珍藏版)》请在三一文库上搜索。
1、C语言程序设计与数据结构,第10章 文件读写,C语言程序设计与数据结构,教学提示:存储在变量和数组(即内存)中的数据是临时的,这些数据在程序运行结束后会消失,而文件可以用来永久地保存大量的数据。如果有些数据需要反复使用或永久保存,应该考虑使用文件来完成。 教学要求:本章要掌握文件在读写之前必须打开,读写结束必须关闭。文件可按只读、只写、读写、追加四种操作方式打开,同时还必须指定文件的类型是二进制文件还是文本文件。文件可按字节,字符串,数据块为单位读写,文件也可按指定的格式进行读写。文件内部的位置指针可指示当前的读写位置,移动该指针可以对文件实现随机读写。,C语言程序设计与数据结构,10.1 文
2、件概述与文件指针,所谓“文件”是指一组相关数据的有序集合。 我们在前几章中已多次接触使用过文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。,C语言程序设计与数据结构,10.1.1 文件分类,文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来。C语言把文件看作是由一个个字符(字节)的数据顺序组成的。它把数据看作是连续的字符(字节)流,这样它对文件的存取实际上是以字符(字节)为单位的。输入输出的数据流的开始和结束只受程序的控制而不受特定符号(比如回车换行符)的控制。也就是说,C语言在输出数据到文件中时,并不会自动增加回车换行符以示结束,在输入时也不会以读入回车换行符
3、作为数据的间隔。,C语言程序设计与数据结构,10.1.1 文件分类,从用户的角度看,文件可分为普通文件和设备文件两种。 根据文件的存储形式,可分为ASCII码文件和二进制文件两种: (1) ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如一个整型数据1234在文本文件中占4个字节。我们用Windows自带的记事本软件打开该类型文件能读懂文件中的内容。 (2) 二进制文件是按二进制的编码方式来存放文件的。例如一个整型数据230在二进制文件中占2个字节。,C语言程序设计与数据结构,10.1.2 文件类型指针,在语言中要使用文件,必须用一个指
4、针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。 定义文件指针的一般形式为:FILE *指针变量标识符; 其中FILE必须为大写,它是在头文件stdio.h中定义的一个结构体,该结构体中含有文件名、文件状态和文件当前位置等信息,我们编程时不必关心FILE结构的细节。 例如: FILE *fp;表示定义了一个名为fp的文件指针。如果变量fp已被正确赋值,则可以根据结构变量fp所提供的信息找到一个文件并实施对该文件的操作。习惯上把fp称为指向一个文件的指针。,C语言程序设计与数据结构,10.2 文件的打开与关闭,使用文件必须遵循“先打开,再对文件进行读写操作,
5、最后关闭文件”的原则。 在语言中,对文件的这些操作都可以由库函数来完成,对用到的库函数的声明包含在文件stdio.h中,因此在编程中要操作文件时,要使用头文件包含命令#include “stdio.h”。,C语言程序设计与数据结构,10.2.1 文件的打开,所谓打开文件,实际上是获得文件的各种有关信息,并使文件指针指向该文件,以便进行下一步操作。C语言提供了函数fopen来打开文件。 其使用格式为: 文件指针名=fopen(文件名, 使用文件方式); 其中,“文件指针名”必须是已被说明为FILE 类型的指针变量;“文件名”是将被打开的文件的文件名,通常是字符串常量或字符串数组(注意路径的分隔符
6、应使用“”);“使用文件方式”是指文件的类型和操作要求,是一个由一对双引号括起来的字符串,共有12种,具体的符号表示和含义见表10-1。,C语言程序设计与数据结构,C语言程序设计与数据结构,fopen打开文件,例如: FILE *fpTa; fpTa=fopen(“c:cprogramabc“,“rb“); /*反斜线“”中的第一个表示转义字符*/ 其意义是打开C驱动器磁盘的cprogram子目录下的文件abc,这是一个二进制文件,只允许按二进制方式进行读操作。 又如: FILE *fp; fp= fopen (“mytest1.txt“,“r“); 其意义是在当前目录下打开文件mytest1
7、.txt,只允许进行“读”操作,并使fp指向该文件。,C语言程序设计与数据结构,10.2.2 文件关闭函数,在使用完一个文件以后,应该将该文件关闭,以防止它再被调用或丢失数据。“关闭”就是使文件指针变量不再指向该文件,也就是文件指针变量与该文件“断开”,此后不能通过该指针对原来与其相联系的文件进行读、写操作(除非再次打开该文件,使文件指针变量重新指向该文件)。 fclose()函数用来关闭一个已经由fopen()函数打开的文件,正常完成关闭文件操作时,fclose函数返回值为0,有错误发生则返回非零值。 其调用的一般形式为: fclose(文件指针); 例如: fclose(fp);,C语言程
8、序设计与数据结构,10.3 文件位置指针的有关函数,在文件内部有一个位置指针,用来指向文件的当前读写字节。在文件打开时,该位置指针总是指向文件的第一个字节。使用下面章节介绍的fgetc等函数对文件进行读写后,该位置指针将自动向后移动。 但文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均自动向后移动,它不需在程序中定义说明,而是由系统自动设置的。,C语言程序设计与数据结构,顺序读写和随机读写,文件的读写方式分为顺序读写和随机读写。 (1) 顺序读写即读
9、写文件只能从头开始,顺序读写各个数据。 但在实际问题中常要求只读写文件中某一指定的部分,为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。 (2) 随机读写可以通过利用系统函数去主动移动文件内部的位置指针来实现。这样的函数主要有两个,即 rewind 函数和fseek函数。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。在移动位置指针之后,即可用后面介绍的任一种读写函数进行读写。由于一般是读写一个数据据块,因此常用fread和fwrite函数。,C语言程序设计与数据结构,rewind函数,rewind函数的功能是把文件内部的位置指针移到文件
10、首。其调用形式为: rewind(文件指针); “文件指针”指向被移动的文件。,C语言程序设计与数据结构,fseek函数,fseek函数用来移动文件内部位置指针,其调用形式为: fseek(文件指针,位移量,起始点); 其中: “文件指针”指向被移动的文件。 “位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB 时不会出错。当用常量表示位移量时,要求加后缀“L”。 “起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。,C语言程序设计与数据结构,C语言程序设计与数据结构,例如: fseek(fp,100L,0); /* 将文件位置指针移
11、到离文件头100个字节处 */ fseek(fp,20L,1); /* 将文件位置指针从当前位置后移20个字节的位置 */ fseek(fp,-10L,SEEK_END); /* 将文件位置指针从文件末尾前移10个字节的位置 */ 注意:fseek函数一般用于二进制文件。在文本文件中由于要进行转换,往往计算的位置会出现错误。,C语言程序设计与数据结构,ftell函数: 用来得到流式文件中的当前位置,用相对于文件开头的位移量来表示。如返回-1L则表示出错。 例如:long a; a=ftell(fp); 文件结束检测函数feof 函数feof( )判断文件是否处于文件结束位置,如文件结束,则返回
12、值为1,否则为0。 其调用格式为: feof(文件指针); 说明:文件结束标志EOF (每个文件末有一结束标志EOF,值为-1)只适用于判断文本文件是否结束。而函数feof( )则对文本文件和二进制文件都适用。,C语言程序设计与数据结构,10.4 读写文件,10.4.1 字符读写函数fgetc和fputc 是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个字符。字符输入/出函数所处理的文件可以是文本文件,也可以是二进制文件。 10.4.2 字符串读写函数fgets和fputs 处理的文件一般是文本文件,读写的数据以字符串为单位。 10.4.3 数据块读写函数fread和fwtr
13、ite 用于整块数据的读写函数。可用来读写一组数据,如一个数组、一个结构变量的值等。 10.4.4 格式化读写函数fscanf和fprintf 与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。两者的区别在于fscanf函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。,C语言程序设计与数据结构,读字符函数fgetc,fgetc函数的功能是从指定的文件中读取一个字符,函数调用的一般形式为: 字符变量=fgetc(文件指针); 例如:ch=fgetc(fp); 其意义是从打开的文件fp中读取一个字符并送入字符变量ch中。 对于fgetc函数的使用有以下几点
14、说明: (1) 在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。 (2) 读取字符的结果也可以不向字符变量赋值,例如fgetc(fp); 但是读出的字符不能保存。 (3) 文件内部的位置指针在文件打开时总是指向文件的第一个字节。使用fgetc函数后,该位置指针将向后移动一个字节。因此可连续多次使用fgetc函数来读取多个字符。,C语言程序设计与数据结构,【例10.1】将C盘根目录下的文本文件test1.txt的内容在屏幕上输出。 #include main() FILE *fp; /* 定义了文件指针fp */ char ch; if(fp=fopen(“c:test1.txt“
15、,“r“)=NULL) /*以读文本文件方式打开并使fp指向该文件*/ printf(“nCannot open file, strike any key to exit!“); getchar(); exit(1); ch=fgetc(fp); /* 先读出一个字符,然后进入循环 */ while(ch!=EOF) /* 判断文件是否结束 */ putchar(ch); /*把该字符显示在屏幕上*/ ch=fgetc(fp); /*再读入下一字符 */ fclose(fp); printf(“n”); 本例程序的功能是从文件中逐个读取字符,并在屏幕上显示。如打开文件出错,给出提示并退出程序。
16、只要读出的字符不是文件结束标志EOF,就把该字符显示在屏幕上,再读入下一字符。每读一次,文件内部的位置指针向后移动一个字符,文件结束时,该指针指向EOF。执行本程序将显示文件c:test1.txt的所有内容。,C语言程序设计与数据结构,写字符函数fputc( ),fputc函数的功能是把一个字符写入指定的文件中,如写入成功则返回写入的字符,否则返回一个EOF,可用此来判断写入是否成功。 函数调用形式为: fputc(字符量,文件指针); /* 字符量是待写入的字符常量或变量 */ 例如:fputc( x, fp ); 其意义是把字符x写入fp所指向的文件的位置指针的当前位置中。每写入一个字符,
17、文件内部位置指针向后移动一个字节。 被写入的文件可以用写、读写、追加方式打开。,C语言程序设计与数据结构,【例10.2】 将从键盘上输入的一些字符(以“*”作为结束)写入c盘根目录下 名为test2.txt的文本文件中。 #include “stdio.h“ main( ) FILE *p; char ch; if(p=fopen(“c:test2.txt“,“w“)=NULL) printf(“File can not open!n“); exit(0); printf(“Please input,end input with * character:“); while(ch=getchar
18、()!=*) fputc(ch,p); fclose(p); printf(“Write over!n “); 程序运行结束后,可以在c盘根目录下打开test2.txt查看其内容。 思考一下,如果在写入完毕后想马上把刚才输入的内容打印在屏幕上该如何实现?,C语言程序设计与数据结构,字符串输入/出函数,字符串输入/出函数所处理的文件一般是文本文件,读写的数据以字符串为单位。 1. 读字符串函数fgets 功能是从指定的文件中读一个字符串到字符数组中. 函数调用的形式为: fgets(字符数组名, n, 文件指针); 其中n是一个正整数。该函数表示从文件中读出n-1个字符(如在读满n-1个字符之前
19、就遇到了换行符或EOF,则读出提前结束),并在读取的最后一个字符后加上串结束标志0。fgets函数的返回值是字符数组的首地址。读取字符串后文件位置指针也自动后移若干个位置。 例如:fgets(str,n,fp); 意义是从fp所指的文件中读出n-1个字符送入字符数组str中。,C语言程序设计与数据结构,【例10.3】从test2.txt文件中读入8个字符组成一个字符串。 #include main() FILE *fp; char arr20; if(fp=fopen(“c:test2.txt “,“r“)=NULL) printf(“nCannot open file,strike any
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计与数据结构 语言程序设计 数据结构 课件 10
链接地址:https://www.31doc.com/p-2152613.html