文件操作系统管理数据的基本单位存储在外存储器上的数据的.ppt

上传人:本田雅阁 文档编号:2378583 上传时间:2019-03-24 格式:PPT 页数:61 大小:393.01KB
返回 下载 相关 举报
文件操作系统管理数据的基本单位存储在外存储器上的数据的.ppt_第1页
第1页 / 共61页
文件操作系统管理数据的基本单位存储在外存储器上的数据的.ppt_第2页
第2页 / 共61页
文件操作系统管理数据的基本单位存储在外存储器上的数据的.ppt_第3页
第3页 / 共61页
亲,该文档总共61页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《文件操作系统管理数据的基本单位存储在外存储器上的数据的.ppt》由会员分享,可在线阅读,更多相关《文件操作系统管理数据的基本单位存储在外存储器上的数据的.ppt(61页珍藏版)》请在三一文库上搜索。

1、,文件 操作系统管理数据的基本单位 存储在外存储器上的数据的集合 使用文件的目的 程序与数据分离:数据文件的改动不引起程序的改动 数据共享:不同程序可以访问同一数据文件中的数据 能长期保存程序运行的中间数据或结果数据,第9章 文件操作,本章要求:,掌握C语言中文件的概念 掌握打开文件的不同模式 掌握使用各种操作函数对文件进行读写的方法 能编写与文件有关的程序,本章难点: 掌握文件的各种操作函数,能对文件进行读写数据操作。,本章重点: 掌握文件的各种操作函数,能对文件进行读写数据操作。,第9章 文件操作,9.1.1 文本文件与二进制文件,C语言把文件看作一个字节序列,即由一连串的字节组成,称为“

2、流”,每一个字节都可以单独读取,每一个文件或者以文件结束标志结束,或者在特定的字节号处结束。 按数据的组织形式分类 1、文本文件 又称ASCII文件,每个字节对应一个字符,用于存放该字符的ASCII码,输入输出时对字符逐个处理。 文本文件由文本行组成,每行中可以有0个或多个字符,并以行终止符n结尾,文件结尾是文件结束标志,该标志后再没有字符出现了。 2、二进制文件 数据按其在内存中的存储形式原样存放,00100111 00010000,内存存储形式,00100111 00010000,二进制形式,00110001 00110000 00110000 00110000 00110000,ASCI

3、I形式,文本文件特点: 速度慢、便于对字符操作,二进制文件特点: 速度快、便于存放中间结果,【例】整数10000,9.1.2 缓冲文件系统,缓冲文件系统:系统自动地为每一个正在使用的文件在内存中开辟一个缓冲区。 对输入输出进行缓冲,可以大块地转移信息,而不再是一个个字节进行操作。 内存缓冲区的大小,影响着操作外存的次数。内存缓冲区越大,则操作外存的次数就少,执行速度就快、效率高。,9.1.3 文件类型指针,C语言的缓冲文件系统中,用文件类型指针来表示文件。 定义文件类型指针的一般形式:,FILE *指针变量名;,C编译系统定义的一种结构体类型,其中的成员用于存放有关文件的一些信息(文件名、文件

4、状态和文件当前读写位置等),指针变量用于指向一个文件,实际上是用于存放文件缓冲区的首地址。,FILE结构体是在头文件中定义的,对文件操作的程序,在最前面都应写上文件包含命令: #include C语言通过文件指针变量对文件进行打开、读、写及关闭操作。,FILE结构体类型在头文件stdio.h中定义如下: typedef struct short level; /*文件缓冲区占用程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*若无缓冲区不读取字符*/ short bsize; /*文件缓冲区大小*/

5、 unsigned char *buffer; /*数据缓冲区的位置*/ unsigned char *curp; /*指针当前的位置*/ unsigned istemp; /*临时文件指示器*/ short token; /*用于操作有效性检查*/ FILE; /*文件类型符*/,9.1.3 文件类型指针,在编程时不必关心FILE结构的具体细节,只需在使用I/O函数时用这个文件指针变量来指定所操作的文件。,9.1.3 文件类型指针,在C语言程序中使用文件,需要完成以下工作: 1)声明一个FILE类型的文件指针变量; 2)打开文件: 调用fopen函数将此文件指针变量和某一个实际的磁盘文件相联

6、系。要求指定文件名,并且说明对该文件是输入操作还是输出操作。 3)读写文件: 调用适当的文件操作函数完成必要的I/O操作。 对输入文件来说,函数从文件中将数据读取至程序中; 对输出文件来说,函数将程序中的数据转移到文件中去。 4)关闭文件: 调用fclose函数表明文件操作结束,断开文件指针与实际文件之间的联系。,9.2 文件的打开与关闭,9.2.1 文件的打开,打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件; 缓冲文件系统借助文件指针来对文件进行管理和访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数据。,“文件名”和“文件打开模式”都是字符串常量或字符数组。,文

7、件指针名=fopen(“文件名“,“文件打开模式“),需要打开的文件的名字,确定文件的 数据操作方式,打开文件使用函数fopen 其调用的一般形式为:,举 例,FILE *fp; fp=fopen(“source.txt“,“r“);,作用: 以读的方式(“r”模式即表示读“read”)打开当前目录下文件名为source.txt的文件。 如果打开文件成功,则返回一个指向source.txt文件信息区的起始地址的指针,并赋值给fp,即fp指向了文件source.txt。其后所有对该文件的操作都必须通过fp指针来实现。 如果文件打开失败,则返回一个空指针NULL,赋值给fp。 说明: 文件名可以包

8、含路径和文件名两部分。 写路径时,因为转义字符以反斜杠开头,所以“”才是表示一个反斜杠。 【例】若路径和文件名为:“c:tcsource.txt”,则应写成“c:tcsource.txt”。,9.2.1 文件的打开,文件的打开模式,9.2.1 文件的打开-模式说明,1)“r”模式: 只能用于输入(读操作),且只能打开一个已经存在的文件。 2)“w”模式: 只能用于输出(写操作)。 如果指定的文件不存在,则新建一个文件; 如果文件存在,则把原来的文件删除,再重新建立一个空白的文件。 3)“a”模式: 用于追加操作。 如果指定的文件不存在,则新建该文件; 如果文件存在,保留该文件原有的数据,在原文

9、件的末尾添加新的数据。 4)打开方式带上“b”表示是对二进制文件进行操作。带上“+”表示既可以读,又可以写。而对待文件存在与否的不同处理则按照“r”、“w”、“a”各自的规定。 5)如果在打开文件时发生错误,即打开失败,fopen返回一个空指针NULL。,文件打开可能出现的错误有: 试图以“读”模式(带“r”的方式)打开一个并不存在的文件; 试图以“写”方式(带“w”或“a”的方式、“r+”或“rb+”方式)打开被设置为“只读”属性的文件。 新建一个文件,而磁盘上没有足够的剩余空间或磁盘被写保护。 用不正确的模式打开一个文件可能会破坏文件的内容。 为避免因上述原因的出错,常用以下的方法来打开一

10、个文件:,9.2.1 文件的打开-模式说明,if(fp=fopen(“source.txt“,“r“)=NULL) printf(“This file could not be opened !n“); exit(0) /*返回操作系统*/ else /*此处编写对文件读/写的代码*/ ,#include ,9.2 文件的打开与关闭,9.2.2 文件的关闭,【例】fclose(fp) 关闭由指针fp指定的文件,同时根据需要刷新缓冲区。 如果文件成功关闭,fclose函数将返回值0,否则返回EOF。,fclose(文件指针变量);,对文件的操作完成后,应确保关闭程序中打开的文件,以避免文件的数据

11、丢失。 关闭文件指断开指针与文件之间的联系,也就禁止再对该文件进行操作。 磁盘已满、磁盘被移走或者出现I/O错误等都会导致fclose函数执行失败。,9.2 文件的打开与关闭,不关闭文件可能会丢失数据,9.3 文件的读写,使用fopen成功打开文件后,都会有属于该文件的一个文件读写位置指针,表示文件内部即将要读写的位置。 文件指针和文件内部的读写位置指针是不同的,9.3.1 文件读写函数概述,9.3 文件的读写,文件指针和文件内部的读写位置指针是不同的 文件指针指向整个文件,在程序中定义,只要不重新赋值,文件指针的值不变。 文件内部的读写位置指针用于指示文件内部的当前读写位置,每读写一次,该指

12、针均自动向后移动,指向下一个读写单元。它不需在程序中定义,由系统自动设置。 以“r”或“w”方式打开文件后,该文件读写位置指针初始值指向文件开头; 以“a”方式打开文件后,该文件读写位置指针初始值指向文件末尾。,9.3 文件的读写,对文件进行读写操作时,需要判断当前读写位置,如果文件读操作到最后,再进行读写操作就会出错。 为了避免出错,C提供了下面的方式判断文件是否读完 1、对于文本文件,结束标记是EOF(即-1,在stdio.h中定义),可以通过读取的字符是不是结束标记来判断文本文件是否读完; 2、对于二进制文件,没有EOF的结束标志,只能使用系统提供的feof函数来判断; 其中,fp是文件

13、指针变量,如果文件读取结束则返回非0值,没结束返回0值。 3、文本文件可使用feof函数按上面形式来判断是否读取结束。,while( !feof(fp) /*此处写入读操作语句*/ ,使用格式是: feof(fp),9.3 文件的读写,9.3.2 字符读写函数,(1)字符读函数fgetc( ) 功能:从指定的文件中读一个字符; 函数调用的一般形式: 字符变量=fgetc(文件指针变量); 【例】 ch=fgetc(fp1); /*从fp1指向的文件中读取一个字符并送入变量ch中*/ 说明: 在fgetc函数调用中,读取的文件必须是以读或读写方式打开的 读取成功返回文件当前位置的一个字符; 读错

14、误时返回EOF。,9.3 文件的读写,9.3.2 字符读写函数,(2)字符写函数fputc( ) 功能:将一个字符写入到指定文件中; 函数调用的一般形式: fputc(字符变量,文件指针变量); 【例】 fputc(ch,fp2); /* 将字符变量ch中的字符写入到fp2所指的文件中 */ 说明: fputc函数也有返回值 若写操作成功,则返回向文件所写的字符; 否则返回EOF,表示写操作失败。,例 9-1 用依次读取字符的方式,将source.txt文件的内容复制到destination.txt文件中。,9.3 文件的读写,void main() FILE *fp1,*fp2; char

15、ch; if(fp1=fopen(“C:source.txt“,“r“)=NULL) printf(“File could not be opened!n“); exit(0); if(fp2=fopen(“C:destination.txt“,“w“)=NULL) printf(“File could not be opened!n“); exit(0); while(ch=fgetc(fp1)!=EOF) fputc(ch,fp2); fclose(fp1); fclose(fp2); ,9.3.3 字符串读写函数,(1)字符串读函数fgets( ) 功能:从指定的文件中读取一个字符串到程

16、序中的字符数组 函数调用的一般形式: 参数n是一个正整数,表示从文件中读出的字符串不超过n-1个字符。因为要在读入的最后一个字符后加上字符串结束标志0。 说明: fgets函数从文件中读取字符直到遇见回车符或EOF为止,或直到读入了所限定的字符数(至多n-1个字符)为止。 函数读成功返回字符数组首地址;失败返回空指针NULL。,9.3 文件的读写,fgets(字符数组名,n ,文件指针);,9.3.2 字符读写函数,(2)字符串写函数fputs( ) 功能:将一个字符串写入到指定文件中 函数调用的一般形式: 字符串可以是字符串常量,也可以是字符数组名,或字符指针变量。 【例】char *ch=

17、“You Are Good!“ fputs(ch,fp2); /* 将字符指针ch指向的字符串写入到文件fp2中 */ 说明: 若函数调用fputs返回值为EOF时,表明写操作失败。,9.3 文件的读写,fputs(字符串,文件指针),例9-2 修改例9-1程序,用读取字符串的方式,将source.txt文件的内容复制到destination.txt文件中。,9.3 文件的读写,void main() FILE *fp1,*fp2; char ch80; if(fp1=fopen(“C:source.txt“,“r“)=NULL) printf(“File could not be opene

18、d!n“); exit(0); if(fp2=fopen(“C:destination.txt“,“w“)=NULL) printf(“File could not be opened!n“); exit(0); while(!feof(fp1) fgets(ch,81,fp1); fputs(ch,fp2); fclose(fp1); fclose(fp2); ,9.3 文件的读写,字符读写函数: fgetc()和fputc() 字符串读写函数:fgets()和fputs() 格式读写函数: fscanf()和fprintf() 数据块读写函数:fread()和fwrite(),9.3.4

19、格式读写函数,(1)格式化读函数fscanf 功能:从指定的文件中按照一定的格式读取数据到程序中 fscanf与scanf功能相似,区别在于fscanf的读取对象是磁盘文件,scanf的读取对象是键盘。 函数调用的一般形式: 其中,格式字符串和输入表列和scanf函数相似。 【例】fscanf(fp,“%5d“, 说明: 函数的返回值若为EOF,表明格式化读错误;否则读数据成功。,9.3 文件的读写,fscanf(文件指针,“格式字符串“,输入表列);,(2)格式化写函数fprintf 功能:把格式化的数据写到指定文件中 fprintf与printf功能相似,区别在于fprintf是向文件中输

20、出,而printf是向屏幕输出。 函数调用的一般形式: 其中,格式控制字符串和输出项列表和printf函数相似。 【例】 fprintf(fp,“%5d“,ai); 说明: 函数的返回值为实际写入文件中的字符个数(字节数); 若写错误,则返回一个负数。,9.3 文件的读写,9.3.4 格式读写函数,fprintf(文件指针,“格式控制字符串“,输出项列表);,例9-3 随机产生20个10,99之间的整数,以每行5个数据输出到文本文件c:data.txt中,要求每个数据占5个宽度,并且数据之间用逗号分隔。然后将其读出按升序排序后,按同样格式追加写在原文件后,与原数据之间空出2行。 编程分析: 采

21、用模块化程序设计 将产生数据、将数据输出到文件、从文件中读取数据,排序和追加数据到文件分别写成GetData( )、PutDataToFile( )、GetDataFormFile( )和sort( )、AppendDataToFile( )函数,9.3 文件的读写,void main() int a20,i; GetData(a,20); PutDataToFile(a,20); /*调用scandata()函数将数据读入到数组a中*/ GetDataFormFile(a,20); sort(a,20); /*调用sort()函数将数组a的数据排序*/ /*调用AppedDataToFile

22、( ) 函数将排序后的数组a的数据写入到文件中*/ AppendDataToFile(a,20); void GetData(int a,int n) int i; srand(time(NULL); /* 初始化随机种子数 */ for(i=0;in;i+) ai=(rand()%90)+10; /* 产生10,99的随机整数 */ ,9.3 文件的读写,void PutDataToFile(int a,int n) int i; OpenFile(“c:data.txt“,“w“); for(i=0;in;i+) if(i%5=0) fprintf(fp,“%5d“,ai); else f

23、printf(fp,“,%5d“,ai); if(i+1)%5=0) fprintf(fp,“n“); fclose(fp); void GetDataFormFile(int a,int n) /* 从文件读数据函数 */ int i; OpenFile(“c:data.txt“,“r“); for(i=0;in;i+) if(i%5=0) fscanf(fp,“%5d“, ,9.3 文件的读写,void sort(int a,int n) int i,j,k,t; for(i=0;iaj)k=j; t=ai; ai=ak; ak=t; void OpenFile(char *file,ch

24、ar *pr) if(fp=fopen(file,pr)=NULL) /* 打开文件失败 */ printf(“Cannot open file,stike any key to exit!“); exit(0); /* 退出程序 */ ,9.3 文件的读写,void AppendDataToFile(int a,int n) /*追加数据函数 */ int i; OpenFile(“c:data.txt“,“a“); /* 打开文件失败 */ fprintf(fp,“nn“); /* 输出2个空行 */ for(i=0;in;i+) if(i%5=0) fprintf(fp,“%5d“,ai

25、); else fprintf(fp,“,%5d“,ai); if(i+1)%5=0) fprintf(fp,“n“); fclose(fp); ,9.3 文件的读写,#include #define STUNUM 5 /*代表学生人数*/ #define COURSENUM 3 /*代表课程门数*/ struct student int sno; /*学号*/ char sname10; /*学生姓名*/ int scoreCOURSENUM; /*每个学生的三门课成绩*/ stu1STUNUM,stu2STUNUM;,例9-4 从键盘输入5个学生的学号、姓名和成绩,将学生数据写入文件,然后

26、再从文件中将这些信息读出显示在屏幕上。,9.3 文件的读写,void main() FILE *fp; int i,j; if(fp=fopen(“c:stu.txt“,“w+“)=NULL) printf(“File could not be opened!n“); exit(0); printf(“input data:n“); for(i=0;iSTUNUM;i+) /*从键盘输入学生数据*/ scanf(“%d“, ,9.3 文件的读写,for(i=0;iSTUNUM;i+) /*学生数据写入文件中*/ fprintf(fp,“%d,“,stu1i.sno); fprintf(fp,“

27、%s,“,stu1i.sname); for(j=0;jCOURSENUM;j+) fprintf(fp,“%d,“,stu1i.scorej); rewind(fp); /*文件的位置指针移动到文件开始处*/ for(i=0;iSTUNUM;i+) /*将文件中学生数据读入程序中*/ fscanf(fp,“%d,“, ,9.3 文件的读写,printf(“nsnotsnamettscoresn“); for(i=0;iSTUNUM;i+) /*将读出的数据显示在屏幕上*/ printf(“%dt“,stu2i.sno); printf(“%st“,stu2i.sname); for(j=0;

28、jCOURSENUM;j+) printf(“%dt“,stu2i.scorej); printf(“n“); fclose(fp); ,9.3 文件的读写,9.3.5 数据块读写函数,(1)读取数据块函数fread 功能:从指定文件中读取若干个数据块到程序中 函数调用的一般形式为: 参数buffer是一个指针,表示存放输入数据的内存存储地址; 参数size表示一个数据块的字节数; 参数count表示要读写的数据块块数。,9.3 文件的读写,9.3.5 数据块读写函数,(2)写数据块函数fwrite 功能:将若干个数据块写入到指定的文件中 函数调用的一般形式为: 参数buffer是一个指针,表

29、示存放输出数据的内存存储地址; 参数size表示一个数据块的字节数; 参数count表示要读写的数据块块数。,9.3 文件的读写,fwrite(buffer,size,count,fp);,#include #define STUNUM 5 /*代表学生人数*/ #define COURSENUM 3 /*代表课程门数*/ struct student int sno; /*学号*/ char sname10; /*学生姓名*/ int scoreCOURSENUM; /*每个学生的3门课成绩*/ stu1STUNUM,stu2STUNUM;,例9-5 改写例9-4使用数据块读写函数从键盘输入

30、5个学生的学号、姓名和成绩,将学生数据写入文件,然后再从文件中将这些信息读出显示在屏幕上。,9.3 文件的读写,void main() FILE *fp; int i,j; if(fp=fopen(“c:stu.dat“,“wb+“)=NULL) /*二进制模式打开文件读和写*/ printf(“File could not be opened!n“); exit(0); printf(“input data:n“); for(i=0;iSTUNUM;i+) /*从键盘输入学生数据*/ scanf(“%d,“, ,9.3 文件的读写,fwrite(stu1,sizeof(struct stud

31、ent), STUNUM,fp); /*学生数据写入文件中*/ rewind(fp); /*文件的位置指针移动到文件开始处*/ fread(stu2,sizeof(struct student), STUNUM,fp); /*将文件中数据读入程序中*/ printf(“nsno tttsnametscores n“); for(i=0;iSTUNUM;i+) /*将读出的数据显示在屏幕上*/ printf(“%dt“,stu2i.sno); printf(“%st“,stu2i.sname); for(j=0;jCOURSENUM;j+) printf(“%dt“,stu2i.scorej);

32、 printf(“n“); fclose(fp); ,9.3 文件的读写,9.3.6 随机读写文件,前面的文件读写函数都是以顺序的方式操作的,如果用户希望直接读取文件中某一部分的信息,必须从文件头开始读,直到要求的文件读写位置再进行操作,这显然不方便。 为了解决这个问题,可以移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写方式称为随机读写。 随机读写最常用于二进制文件。 实现随机读写的关键是按要求移动位置指针,这称为文件的定位。 C语言提供了一组文件的随机读写函数,可以将文件读写位置指针定位在所要求读写的地方,从而实现随机读写。,9.3 文件的读写,函数原型:int fseek(F

33、ILE *stream, long offset, int fromwhere) 功能:将文件的读写位置指针设置到特定的位置 返回值:成功,返回0;失败,返回非0值,位移量(以起始点为基点,移动的字节数) 0 向后移动; 0 向前移动; =0保持不动,起始点 文件开始 SEEK_SET 0 文件当前位置 SEEK_CUR 1 文件末尾 SEEK_END 2,例 fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2);,fseek函数,9.3 文件的读写,ftell函数:long ftell(FILE *stream); 返回文件读写位置指针的当前

34、值,这个值是从文件头开始算起到文件指针位置的字节数,返回的数为长整型数; 若返回-1,表明出现错误。 rewind函数:int rewind(FILE *stream); 用于将文件内部的读写位置指针移动到文件的开始处; 成功时返回0;否则,返回非0值。,9.3 文件的读写,#include #define STUNUM 5 /*代表学生人数*/ #define COURSENUM 3 /*代表课程门数*/ struct student int sno; /*学号*/ char sname10; /*学生姓名*/ int scoreCOURSENUM; /*每个学生的三门课成绩*/ stu;

35、void main() FILE *fp; int i; if(fp=fopen(“c:stu.dat“,“rb“)=NULL) printf(“File could not be opened!n“); exit(0); ,例9-6 从例9-5所建立的文件c:stu.dat中读取第2个学生的所有信息并显示在屏幕上。,9.3 文件的读写,fseek(fp,1L*sizeof(struct student),SEEK_SET); /* 文件位置指针移动到第一个学生数据之后 */ fread( ,9.3 文件的读写,本章结束,9.4 应用举例,9.4.1 文件的加密和解密,例9-8 设计一个对指定

36、文件进行加密和解密的程序,密码和文件名由用户输入。 【加密方法】 以二进制打开文件,将密码中每个字符的ASCII码值与文件的每个字节进行异或运算,然后写回原文件原位置即可。这种加密方法是可逆的,即对明文进行加密得到密文,用相同的密码对密文进行加密就得到明文。此方法适合各种类型的文件加密解密。 下面用两种方法实现对文件的加密和解密。,9.4 应用举例,方法一:程序运行后,用户在提示下输入文件名和密码。 编辑分析:由于涉及到文件的读和写,采用逐个字节从原文件中读出,加密后写入一个新建的临时文件,最后,删除原文件,把临时文件改名为原文件名,完成操作。,#include #include char e

37、ncrypt(char f, char c) /*字符加密函数*/ return f c; /*返回两字符ASCII码按位做异或运算的结果*/ ,void main() FILE *fp, *fp1; char fn40, *p=fn, ps10, *s=ps; char ch; char *tm= “C:temp.tmp“; /临时文件名 printf(“Input the path and filename:“); gets(p); /输入文件名 *tm=*p; /确保临时文件和要加密的文件在同一盘内 / 判断文件是否能打开,临时文件是否能建立 if(fp=fopen(p,“rb“)=NU

38、LL|(fp1=fopen(tm,“wb“)=NULL) printf(“Cannot open file strike any key exit!“); exit(0); / 退出 printf(“Input the password:“); gets(s); / 输入密码,9.4 应用举例,ch=fgetc(fp); while(!feof(fp) /当原文件没读完时 s=ps; /从密码的第一个字符开始处理 while(*s!= 0) ch=encrypt(ch, *s+); /调用函数加密,让s指向下一个密码字符 fputc(ch, fp1); / 把加密后的字节写入临时文件 ch=f

39、getc(fp); / 读入一个字节 fclose(fp); fclose(fp1); remove(p); / 删除原文件 rename(tm, p); / 把临时文件改名为原文件名 ,9.4 应用举例,方法二:将要加密的文件和密码,通过命令行参数传递给程序,并且加密解密过程对文件的读写采有随机读写,不建立临时文件,程序代码如下:,#include #include char encrypt(char f,char c) /字符加密函数 return f c; /返回两字符ASCII码按位做异或运算的结果 ,9.4 应用举例,void main(int argc,char *argv)/ma

40、in函数带两个参数 FILE *fp; char *s,ch; if(argc!=3) /如果输入的命令行参数数目不正确 printf(“Parameter Error! strike any key exit!“); exit(0); /退出 if(fp=fopen(argv1,“rb+“)=NULL) printf(“Cannot open file strike any key exit!“); exit(0); /退出 ch=fgetc(fp);,9.4 应用举例,while(!feof(fp) s=argv2; /从让s指向密码的字符串的首地址 while(*s!= 0) ch=en

41、crypt(ch, *s+); /调用函数对s指向的字符加密,再让s指向下一个密码字符 fseek(fp,-1L,SEEK_CUR); /将位置指针从当前位置向前移1个字节 fputc(ch, fp); /把加密后的字节写入文件原来的位置 fseek(fp,1L,SEEK_CUR); /将位置指针从当前位置向后移1个字节 ch=fgetc(fp); /读入一个字节 fclose(fp); ,9.4 应用举例,设程序经过编译连接生成可执行的文件名为encfile.exe。加密时,命令格式为: encfile文件名 密码 【例】encfile c:myfile.dat apple 功能: 对c盘根

42、目录下的文件myfile.dat以密码apple进行加密,若再次执行相同的命令,则是对myfiel.dat进行解密。 命令行参数argc为3,argv0、argv1、argv2分别为encfile、c:myfile.dat和apple。,9.4 应用举例,9.4 应用举例,9.4.2 文件的拆分和连接,例9-9 将文件file1.txt的内容从中间分成两个部分,前一部分保留在file1.txt,后一部分输出到file2.txt保存。 编程分析: 先求文件的长度,通过其循环控制将file1.txt文件的前一半内容写入到一个临时文件中,后一半内容写入到file2.txt文件中。然后将原file1.

43、txt文件删除,最后将临时文件更名为file1.txt。,9.4 应用举例,#include void main() FILE *fp1,*fp2,*fp_temp; long len; int i; if(fp1=fopen(“C:file1.txt“,“r“)=NULL) printf(“File could not be opened!n“); exit(0); /*若打开失败,结束程序*/ fseek(fp1,0L,SEEK_END); /*移动file1文件位置指针到文件尾*/ len=ftell(fp1); /*求file1文件尾到文件头的字节数*/ if(fp2=fopen(“C

44、:file2.txt“,“w“)=NULL) printf(“File could not be opened!n“); exit(0); /*若打开失败,结束程序*/ ,9.4 应用举例,if(fp_temp=fopen(“C:temp.txt“,“w“)=NULL) printf(“File could not be opened!n“); exit(0); /*若打开失败,结束程序*/ rewind(fp1); /*file1文件位置指针移到文件头*/ for(i=1;i=len/2;i+) /*file1的前一半内容写入临时文件temp*/ fputc(fgetc(fp1),fp_te

45、mp); for(;i=len;i+) /*file1的后一半内容写入file2*/ fputc(fgetc(fp1),fp2); fclose(fp1); /*关闭文件*/ fclose(fp2); /*关闭文件*/ fclose(fp_temp); /*关闭文件*/ remove(“c:file1.txt“); /*删除file1文件*/ rename(“c:temp.txt“,“c:file1.txt“); /*重命名文件temp为文件file1*/ ,9.4 应用举例,#include void main() FILE *fp1,*fp2; char ch; if(fp1=fopen(

46、“C:file1.txt“,“a“)=NULL) /*打开一个文件file1.txt追加*/ printf(“File could not be opened!n“); exit(0); /*若打开失败,结束程序*/ if(fp2=fopen(“C:file2.txt“,“r“)=NULL) /*打开一个文件file2.txt只读*/ printf(“File could not be opened!n“); exit(0); /*若打开失败,结束程序*/ ,例9-10 将C盘根目录下的文件file2.txt的内容连接在file1.txt后面。,9.4 应用举例,while(!feof(fp2) /*当fp2文件没有结束*/ ch=fgetc(fp2); /*读取一个字符*/ fputc(ch,fp1); /*写一个字符*/ fclose(fp1); fclose(fp2); /*关闭文件*/ ,本章小结,文本文件和二进制文件的区别; 缓冲文件系统; 文件指针的概念和定义; 文件的打开和关闭; 文件的字符、字符串、格式化、数据块输入输出函数; 文件的随机读写函数。,本章书面作业,P265 习题一、二、三、四,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1