收藏 分享(赏)

混合班第12章 文件.ppt

上传人:tkhy51908 文档编号:8451562 上传时间:2019-06-28 格式:PPT 页数:38 大小:697KB
下载 相关 举报
混合班第12章  文件.ppt_第1页
第1页 / 共38页
混合班第12章  文件.ppt_第2页
第2页 / 共38页
混合班第12章  文件.ppt_第3页
第3页 / 共38页
混合班第12章  文件.ppt_第4页
第4页 / 共38页
混合班第12章  文件.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、1,第12章 文 件 王占全,2,第12章:文 件,学习的意义,C语言执行程序,输入数据,存在问题:运行完毕,结果消失!,运行结果能否长期保存呢?,使用文件!,文件无处不在,切不可视而不见,时而不理!,如:C语言源程序文件(.c或.cpp)、执行文件(.exe)、图片文件(.jpg),3,学习目标,学习内容,文件的基本概念文件的类别文件操作概述文件指针文件的打开、读写和关闭文件的打开与关闭文件的读写文件读写函数选用原则文件的定位读写文件应用综合举例本章小结,理解文件的概念正确把握文本文件与二进制文件的区别;掌握文件的打开、读写、定位以及关闭的方法;掌握文件系统中有关文件操作的系统函数使用方法;

2、能设计对文件进行简单处理的实用程序;,4,12.1 文件的基本概念,文件:存储在外部介质上数据的集合。,使用数据文件的目的:数据文件的改动不引起程序的改动程序与数据分离不同程序可以访问同一数据文件中的数据数据共享能长期保存程序运行的中间数据或结果数据,文件命名规则:为标识一个文件,每个文件都必须有一个文件名,其一般结构为:主文件名.扩展名文件命名规则,遵循操作系统的约定。例如,一个C语言源程序名为:prg.c,5,12.2 文件的类别,按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按文件的内容 程序文件。程序文件又可分为源文

3、件、目标文件和可执行文件。 数据文件。如各种图像文件、声音文件等。 根据文件的组织形式 顺序存取文件; 随机存取文件。 按数据的组织形式: 文本文件: ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存储形式原样存放,6,short int 数据32767,32767的各字符的ASCII码存放形式,内存存放形式,文本文件特点: 存储量大、速度慢、便于对字符操作,二进制文件特点: 存储量小、速度快、便于存放中间结果,7,12.3 文件操作概述,读文件与写文件,读文件:将磁盘文件中的数据传送到计算机内存的操作。写文件:从计算机内存向磁盘文件中传送数据的操作。,构成

4、文件的基本单元与流式文件,语言将文件看作是由一个一个的字符(ASCII码文件)或字节(二进制文件)组成的。文件中不存在其它更复杂的数据类型和结构,对文件数据的解释完全看程序本身。我们把按这种方式处理的文件称为流式文件。而在其它高级语言中,组成文件的基本单位是记录,对文件操作的基本单位也是记录。C语言程序也可以按照操作系统的方式操作文件,本章只介绍流式文件的操作方法。C语言本身没提供输入输出的功能,必须调用标准库函数进行文件读写。,8,文件处理方法 缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区 非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区,9,12.4

5、文件指针,文件结构体FILE缓冲文件系统为每个正使用的文件在内存开辟文件信息区文件信息用系统定义的名为FILE的结构体描述FILE定义在stdio.h中(Borland C+ 3.1),typedef struct int level; /* fill/empty level of buffer */unsigned flags; /* File status flags */char fd; /* File descriptor */unsigned char hold; /* Ungetc char if no buffer */int bsize; /* Buffer size */un

6、signed char _FAR *buffer; /* Data transfer buffer */unsigned char _FAR *curp; /* Current active pointer */unsigned istemp; /* Temporary file indicator */short token; /* Used for validity checking */ FILE; /* This is the FILE object */,10,文件类型指针 指针变量说明: FILE *fp; 用法: 文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通

7、过这个指针获得文件信息,访问文件 文件关闭后,它的文件结构体被释放,11,12.5 文件的打开、读写和关闭,1、文件的打开与关闭,打开文件fopen,FILE *fopen (char *filename, char *mode);,C文件操作用库函数实现,包含在stdio.h文件使用方式:打开文件文件读/写关闭文件系统自动打开和关闭三个标准文件:,标准输入-键盘 stdin标准输出-显示器 stdout标准出错输出-显示器 stderr,函数原形:,要打开的文件名,打开文件方式,功能:按指定方式打开文件返值:正常打开,为指向文件结构体的指针;打开失败,为NULL,12,打开文件方式mode由

8、两类字符构成: 一类字符表示打开文件的类型t-表示文本文件(text,默认方式),b-表示二进制文件(binary), 另一类字符是操作类型r-表示从文件中读取数据(read),w-表示向文件写入数据(write),a-表示在文件尾追加数据(append),+-表示文件可读可写。,注意:打开文件方式字符串mode其字符先后次序是:操作类型符在前,打开文件类型符在后。如,“rb“、“wt“,不可写成“br“、“tw“。而对于+来说,可以放在操作类型符的右边,也可放在字符串的最后,但不可放在操作类型符的左边。如,“w+b“或“wb+“都是正确的,而“+wb“则是错误的。,例: FILE *fp;

9、fp = fopen (“wang.txt“, “r“); if (fp = = NULL) printf (“the file :wang.txt not found! “);exit (-1); ,13,打开文件fopen,int *fclose (FILE *filepointer);,函数原形:,文件打开时返回的文件类型指针,功能:关闭filepointer指向的文件返值:正常关闭为0;出错时,非0作用: 使文件指针变量与文件“脱钩”,释放文件结构体和文件指针,不关闭文件可能会丢失数据,FILE *fp; fp = fopen (“wang.txt“, “r+“); if (fp =

10、= NULL) printf (“the file :wang.txt not found! “);exit (-1); /读取和加工数据 fclose (fp); /关闭该文件,14,2、文件的读写,在语言中提供了多种文件读写的函数,这些函数主要包括:字符读写函数: fgetc 和 fputc字符串读写函数:fgets 和 fputs数据块读写函数:fread 和 fwrite格式化读写函数:fscanf 和 fprinf,(1) 字符读写函数:fgetc 和 fputc,fgetc,函数原形:,int fgetc (FILE *filepointer);,功能:从filepointer指向

11、的文件中,读入一个字节(字符),同时将读写位置指针向前移动1个字节(即指向下一个字符) 返值:正常,返回读到的代码值;读到文件尾或出错,为EOF,15,fputc,函数原形:,int fputc (int c, FILE *filepointer);,功能:将字符数据c输出到filepointer所指向的文件中去,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。 返值:正常,返回c;出错,为EOF,16,【例1】 将键盘上输入的一个字符串(以作为结束字符),以ASCII码形式存储到一个磁盘文件中,然后从该磁盘文件中读出其字符串并显示出来。,#include #include voi

12、d main (int argc, char *argv ) FILE *fp1,*fp2;char ch;if (argc != 2) /参数个数不对 printf (“the number of arguments not correctnn“);printf (“Usage: 可执行文件名 filename n“);exit (0);if (fp1 = fopen(argv1,“wt“) = NULL) /打开文件失败 printf (“can not open this filen“);exit (0);,/输入字符,并存储到指定文件中for ( ; (ch = getchar( )

13、!= ; )fputc (ch, fp1); /输入字符并存储到文件中fclose (fp1); /关闭文件/顺序输出文件的内容fp2 = fopen (argv1, “rt“); for (; (ch = fgetc(fp2) != EOF; ) putchar (ch); /顺序读入并显示fclose (fp2); /关闭打开的文件 ,运行结果(假设在DOS下输入的命令行如下): example1 wang.txt How are you? How are you?,17,【例2】利用字符读写函数实现文件拷贝。,#include #include void main (int argc,

14、char *argv ) /input:源文件指针, output:目标文件指针FILE *input, *output; if (argc != 3) /参数个数不对 printf (“the number of arguments not correctn“);printf (“n Usage: 可执行文件名 source-file dest-file“);exit (0);/打开源文件失败if (input = fopen(argv1, “r“) = NULL) printf (“can not open source filen“);exit (0);,/创建目标文件失败if (out

15、put = fopen(argv2,“w“) = NULL) printf (“can not create destination filen“);exit (0);/复制源文件到目标文件中for ( ; ( !feof(input) ) ; ) fputc (fgetc(input), output); fclose (input); /关闭源文件fclose (output); /关闭目标文件 ,18,文件读写位置指针:,在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc 函数后, 该位置指针将向后移动一个字节。 因此可连续

16、多次使用fgetc函数,读取多个字符。,文件读写位置指针与文件指针的区别:,文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。, ,19,(2) 字符串读写函数:fgets 和 fputs,fgets,函数原形:,char *fgets (char *s, int n, FILE *filepointer);,功能:从filepointer所指向的文件读取一字节串返值:正常,返回读取的字符串的指针;出错或文件尾,则返回NULL。,从fi

17、lepointer所指文件读n-1个字符送入s指向的内存区, 并在最后加一个0 (若读入n-1个字符前遇换行符或文件尾(EOF)即结束),fputs,函数原形:,int fputs (char *s, FILE *filepointer);,功能:将存放在s中的字符串写到文件指针filepointer所指向的文件中去,同时将读写位置指针向前移动字符串长度个字节。 返值:正常时返回写入的最后一个字符;出错为EOF。,不会将字符串结尾符0写入文件,也不会自动向文件写入换行符,如果需要写入一行文本,s字符串中必须包含n。,20,#include #include void main ( ) FILE

18、 *fp1, *fp2;char str = “123456789“;/创建文本文件wang.txtfp1 = fopen (“wang.txt“, “w“); if (fp1 = = NULL) /创建文件失败 printf (“can not open file: wang.txtn“);exit (0);/将字符串“12345678”写入文件fputs (str, fp1); /写入第一行文本的换行符和下一行文本fputs (“nabcd“, fp1); fclose (fp1); /关闭文件,【例3】向文件wang.txt中写入两行文本,然后分三次读出其内容。,31 32 33 34

19、35 36 37 38 39,0D 0A 61 62 63 64,21,fp2 = fopen (“wang.txt“, “rt“); /以只读方式打开wang.txt文件fgets (str, 8, fp2); /读取字符串,最大长度是7,将是“1234567“printf (“%sn“, str);fgets (str, 8, fp2); /读取字符串,最大长度是7,实际上将是“89n“printf (“%sn“, str);fgets (str, 8, fp2); /读取字符串,最大长度是7,实际上将是“abcd“printf (“%sn“, str);fclose (fp2); /关闭

20、打开的文件 ,运行结果: 1234567,89,abcd,22,#include #include void main (int argc, char *argv ) /input:源文件指针, output:目标文件指针FILE *input, *output; char string81; if (argc != 3) /参数个数不对 printf (“the number of arguments not correctn“);printf (“n Usage: 可执行文件名 source-file dest-file“);exit (0);/打开源文件失败if (input = fop

21、en(argv1,“r“) = NULL) printf (“can not open source filen“);exit (0);,【例4】利用字符串读写函数实现文件拷贝。,/创建目标文件失败if (output = fopen(argv2,“w“) = NULL) printf (“can not create destination filen“);exit (0);/复制源文件到目标文件中while (fgets(string, 81, input) != NULL) fputs (string, output); fclose (input); /关闭源文件fclose (out

22、put); /关闭目标文件 ,23,(3) 数据块读写函数:fread 和 fwrite,fread,函数原形:,unsigned fread (void *ptr, unsigned size, unsigned n, FILE *filepointer);,功能:从filepointer所指向的文件中读取n个数据项,每个数据项的大小是size个字节,这些数据将被存放到ptr所指向的内存中。同时,将读写位置指针向前移动n*size个字节。 返值:如果操作成功,则函数返回值就是读取的数据项的个数(不是字节的个数);如果操作出错或遇到文件尾,则返回0。,24,(3) 数据块读写函数:fread

23、和 fwrite,fwrite,函数原形:,unsigned fwrite (void *ptr, unsigned size, unsigned n, FILE *filepointer);,功能:将ptr所指向的内存中存放的n个大小为size个字节的数据项写入到filepointer所指向的文件中,实际要写入数据的字节数是n*size。同时,将读写位置指针向前移动n*size个字节。返值:如果操作成功,则函数返回值就是实际写入的数据项的个数(不是字节的个数);如果操作出错,则返回0。,注意:fread和fwrite一般用于二进制文件的输入和输出,25,#include #include #

24、include void main ( ) FILE *fp; short i, a10 = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;/创建二进制文件wang.datfp = fopen (“wang.dat“, “wb“); if (fp = = NULL) /创建失败 printf (“can not create file: wang.txtn“);exit (0);/将数组a的10个整型数写入到文件中fwrite (a, sizeof(short), 10, fp); fclose (fp); /关闭文件,/以读的打开二进制文件wang.datfp = fopen (

25、“wang.dat“, “rb“); if (fp = = NULL) /打开失败 printf (“can not open file: wang.datn“);exit (0);/将数组a的10个元素清0memset (a, 0, 10*sizeof(short); /从文件中读取10个整型数据到数组afread (a, sizeof(short), 10, fp); fclose (fp); /关闭文件for (i = 0; i 10; i+) /显示数组a的元素printf (“%d “, ai);,运行结果: 0 1 2 3 4 5 6 7 8 9,【例5】将一个整型数组存放到文件中

26、,然后从文件中读取数据到数组中并显示。,26,#include #include #include struct student_info char no9;char name10;char sex;int age;char address20; ; typedef struct student_info STUINFO;void WriteToFile (STUINFO *pstu, int num); void ReadFromFile (STUINFO *pstu, int num);,【例6】将多个学生的基本信息存放到student.dat文件中,然后从文件中读出并显示。,void m

27、ain ( ) int i, num;STUINFO *pstu;/输入学生人数printf (“input the number of students: “); scanf (“%d“, ,27,【例6】将多个学生的基本信息存放到student.dat文件中,然后从文件中读出并显示。,for (i = 0; i num; i+) /输入学生信息printf (“the %dth student: no = “, i+1);gets (pstui.no);fflush (stdin);printf (“the %dth student: name = “, i+1);gets (pstui.

28、name);fflush (stdin);printf (“the %dth student: sex = “, i+1);scanf (“%c“,/将pstu所指向的学生信息写入文件中WriteToFile (pstu, num); /将pstu所指向的内存块清0 memset (pstu, 0, num * sizeof(STUINFO); /从文件中读取学生信息到pstu所指向的内存块中ReadFromFile (pstu, num); /显示学生信息printf (“%10s%12s%6s%5s%20sn“,“no“,“name“,“sex“,“age“,“address“);for

29、(i = 0; i num; i+)printf (“%10s%12s%6c%5d%20sn“, pstui.no, pstui.name,pstui.sex, pstui.age, pstui.address);free (pstu); /释放动态分配的内存,28,【例6】将多个学生的基本信息存放到student.dat文件中,然后从文件中读出并显示。,/将pstu所指向的学生信息写入文件student.dat中 void WriteToFile (STUINFO *pstu, int num) FILE *fp;fp = fopen (“student.dat“, “wb“);if (fp

30、 = = NULL)printf (“cant create student.datn“);free (pstu);exit (0);fwrite (pstu, sizeof(STUINFO), num, fp);fclose (fp); ,/从文件student.dat中读取学生信息到pstu所指向的内存块中 void ReadFromFile (STUINFO *pstu, int num) FILE *fp;fp = fopen (“student.dat“, “rb“);if (fp = = NULL)printf (“cant open student.datn“);free (ps

31、tu);exit (0);fread (pstu, sizeof(STUINFO), num, fp);fclose (fp); ,29,(4) 格式化读写函数:fscanf 和 fprinf,fscanf,函数原形:,int fscanf ( FILE *filepointer, const char *format,address,);,功能:从filepointer所指向的文件中读取数据。返值:如果操作成功,则函数返回值就是读取的数据项的个数;如果操作出错或遇到文件尾,则返回EOF。,fprintf,函数原形:,int fprintf ( FILE *filepointer, const

32、 char *format,address,);,功能:将表达式输出到filepointer所指向的文件中。返值:如果操作成功,则函数返回值就是写入到文件中数据的字节个数;如果操作出错,则返回EOF。,例如: fprintf (fp, “%d,%6.2f“, i, t); /将i和t按%d, %6.2f格式输出到fp文件 fscanf (fp, “%d,%f“, /若文件中有3, 4.5,则将3送入i,4.5送入t,30,#include #include void main ( ) int i = 3;float f = (float)9.8;FILE *fp;/创建文本文件wang.txt

33、fp = fopen (“wang.txt“, “w“); if (fp = = NULL) /创建失败printf (“cant create file: wang.datn“);exit (0);/将变量i和f的值格式化输出到文件中fprintf (fp, “%2d,%6.2f“, i, f); fclose (fp); /关闭文件,【例7】将变量的值格式化写入文件中,然后从文件中格式化读出并显示。,20 33 2C 20 20 39 2E 38 30,31,/以读的方式打开文件wang.txtfp = fopen (“wang.txt“, “r“); if (fp = = NULL) /

34、打开失败printf (“cant open file: wang.datn“);exit (0);i = 0; /i清0f = 0; /f清0/从文件中读取数值到变量i和ffscanf (fp, “%d,%f“, ,运行结果: i = 3, f = 9.80,注意:文件格式化输出函数fprintf总是以字符串的形式将数据信息存放到文件中,而不是以数值的形式存放到文件中,不管打开的是文本文件还是二进制文件。,32,3、文件读写函数选用原则,读/写1个字符(或字节)数据时:选用fgetc( )和fputc( )函数。读/写1个字符串时:选用fgets( )和fputs( )函数。读/写1个(或多

35、个)不含格式的数据时:选用fread( )和fwrite( )函数。读/写1个(或多个)含格式的数据时:选用fscanf( )和fprintf( )函数。,对使用文件类型的要求:fgetc( )和fputc( )函数主要对文本文件进行读写,但也可对二进制文件进行读写;fgets( )和fputs( )函数主要对文本文件进行读写,对二进制文件操作无意义;fread( )和fwrite( )函数主要对二进制文件进行读写,但也可对文本文件进行读写;fscanf( )和fprintf( )函数主要对文本文件进行读写,对二进制文件操作无意义。,33,12.6 文件的定位读写,几个概念,文件位置指针-指向

36、当前读写位置的指针读写方式,顺序读写:位置指针按字节位置顺序移动,叫 随机读写:位置指针按需要移动到任意位置,叫,rewind,函数原形:,void rewind (FILE *filepointer);,功能:将filepointer所指向的文件的位置指针重新置回到文件的开头。 返值:无,34,fseek,函数原形:,int fseek(FILE *filepointer, long offset, int whence),功能:改变文件位置指针的位置返值:成功,返回0;失败,返回非0值,文件指针,位移量(以起始点为基点,移动的字节数) 0 向后移动 0 向前移动,起始点 文件开始 SEEK

37、_SET 0 文件当前位置 SEEK_CUR 1 文件末尾 SEEK_END 2,ftell,函数原形:,long ftell (FILE *filepointer),功能:返回位置指针当前位置(用相对文件开头的位移量表示)返值:成功,返回当前位置指针位置;失败,返回-1L,35,【例8】磁盘文件上有3个学生数据,要求读入第1,3学生数据并显示。,#include #include #include struct student_info char no9;char name10;char sex;int age;char depart15; stu3 = “0001“, “WangFei“,

38、 M, 18, “Computer“, “0002“, “ZhangMin“, M, 19, “Math“,“0003“, “LiYan“, F, 19, “English“ ;,void main ( ) int i;FILE *fp;/以读写方式打开二进制文件fp = fopen (“student.dat“, “wb+“); if (fp = = NULL) /打开失败 printf (“cant create file: student.datn“);exit (0); /将学生信息写入到文件中fwrite (stu, sizeof(struct student_info), 3, f

39、p);,rewind (fp); /将文件位置指针置回到文件头memset (stu, 0, 3*sizeof(struct student_info); /清除学生信息/读第1和第3个学生的信息到结构数组stu中for (i = 0; i 3; i += 2) /文件位置指针定位fseek (fp, i*sizeof(struct student_info), SEEK_SET); /读取一个学生的信息fread ( /关闭文件 ,运行结果: 0001 WangFei M 18 Computer 0003 LiYan F 19 English,36,【例9】求文件的长度。,#include

40、#include void main (int argc, char *argv ) FILE *fp;long length;if (argc != 2) /命令行参数有误printf (“Useage: 执行文件名 filenamen“);exit (0);,fp = fopen (argv1, “rb“); /以读的方式打开文件if (fp = = NULL) /打开文件失败printf (“file not found!n“);exit (0);/文件位置指针指向文件尾fseek (fp, 0L, SEEK_END);/取文件位置指针当前的位置,即文件的长度length = ftell

41、 (fp); /显示文件长度printf (“Length of File is %ld bytesn“, length); fclose (fp); /关闭文件 ,37,文件的加密方法:最初将KEY的值与文件中的第一个字节进行异或操作写入文件中,文件后面的字节值是将前一个字节值(原始字节值)与其进行异或而成,直到文件结束为止。解密的方法与加密的方法是一样的,因为chkk等于ch,【例10】文件加密/解密。,#include #include #define KEY 0xFA void main (int argc, char *argv ) FILE *fpr, *fpw;char ch,

42、k = (char)KEY;/命令行参数有误if (argc != 3 | *argv2 != + ,fpr = fopen (argv1, “rb“); /以读的方式打开文件if (fpr = NULL) /打开文件失败printf (“file: %s not found!n“, argv1);exit (0);fpw = fopen (argv1, “rb+“); /以读写的方式打开文件if (fpw = NULL) /打开文件失败printf (“file: %s not found!n“, argv1);exit (0);while (ch = fgetc(fpr) != EOF)fputc (chk, fpw);k = (*argv2 = +) ? ch : chk;fclose (fpr); /关闭文件fclose (fpw); /关闭文件 ,38,谢谢大家,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报