文件操作系统管理数据的基本单位存储在外存储器上的数据的ppt课件_第1页
文件操作系统管理数据的基本单位存储在外存储器上的数据的ppt课件_第2页
文件操作系统管理数据的基本单位存储在外存储器上的数据的ppt课件_第3页
文件操作系统管理数据的基本单位存储在外存储器上的数据的ppt课件_第4页
文件操作系统管理数据的基本单位存储在外存储器上的数据的ppt课件_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第9章 文件操作 1v文件文件v操作系统管理数据的根本单位操作系统管理数据的根本单位v存储在外存储器上的数据的集合存储在外存储器上的数据的集合v运用文件的目的运用文件的目的v程序与数据分别:数据文件的改动不引起程程序与数据分别:数据文件的改动不引起程序的改动序的改动v数据共享:不同程序可以访问同一数据文件数据共享:不同程序可以访问同一数据文件中的数据中的数据v能长期保管程序运转的中间数据或结果数据能长期保管程序运转的中间数据或结果数据第第9章章 文件操作文件操作 第9章 文件操作 2本章要求:本章要求:掌握掌握C言语中文件的概念言语中文件的概念掌握翻开文件的不同方式掌握翻开文件的不同方式掌握运

2、用各种操作函数对文件进展读写的方法掌握运用各种操作函数对文件进展读写的方法能编写与文件有关的程序能编写与文件有关的程序本章难点:本章难点: 掌握文件的各种操作函数,能对文件进展读写数掌握文件的各种操作函数,能对文件进展读写数据操作。据操作。本章重点:本章重点: 掌握文件的各种操作函数,能对文件进展读写掌握文件的各种操作函数,能对文件进展读写数据操作。数据操作。第第9章章 文件操作文件操作 第9章 文件操作 39.1.1 文本文件与二进制文件文本文件与二进制文件nC言语把文件看作一个字节序列,即由一连串的字节言语把文件看作一个字节序列,即由一连串的字节组成,称为组成,称为“流,每一个字节都可以单

3、独读取,每流,每一个字节都可以单独读取,每一个文件或者以文件终了标志终了,或者在特定的字一个文件或者以文件终了标志终了,或者在特定的字节号处终了。节号处终了。n按数据的组织方式分类按数据的组织方式分类n 1、文本文件、文本文件n又称又称ASCII文件,每个字节对应一个字符,用于存放文件,每个字节对应一个字符,用于存放该字符的该字符的ASCII码,输入输出时对字符逐个处置。码,输入输出时对字符逐个处置。n文本文件由文本行组成,每行中可以有文本文件由文本行组成,每行中可以有0个或多个字个或多个字符,并以行终止符符,并以行终止符n结尾,文件结尾是文件终了标结尾,文件结尾是文件终了标志,该标志后再没有

4、字符出现了。志,该标志后再没有字符出现了。 n 2、二进制文件、二进制文件n数据按其在内存中的存储方式原样存放数据按其在内存中的存储方式原样存放第9章 文件操作 400100111 00010000内存存储方式内存存储方式00100111 00010000二进制方式二进制方式00110001 00110000 00110000 00110000 00110000ASCII方式方式文本文件特点文本文件特点: 速度慢、便于对字符操作速度慢、便于对字符操作二进制文件特点二进制文件特点: 速度快、便于存放速度快、便于存放中间结果中间结果【例】整数【例】整数10000第9章 文件操作 59.1.2 缓冲

5、文件系统缓冲文件系统 缓冲文件系统:系统自动地为每一个正在运用的文缓冲文件系统:系统自动地为每一个正在运用的文件在内存中开辟一个缓冲区。件在内存中开辟一个缓冲区。 对输入输出进展缓冲,可以大块地转移信息,而不对输入输出进展缓冲,可以大块地转移信息,而不再是一个个字节进展操作。再是一个个字节进展操作。 内存缓冲区的大小,影响着操作外存的次数。内存内存缓冲区的大小,影响着操作外存的次数。内存缓冲区越大,那么操作外存的次数就少,执行速度就缓冲区越大,那么操作外存的次数就少,执行速度就快、效率高。快、效率高。文件文件程序程序数据区数据区输出文件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区第9章 文

6、件操作 69.1.3 文件类型指针文件类型指针 C言语的缓冲文件系统中,用文件类型指针来表示文件。言语的缓冲文件系统中,用文件类型指针来表示文件。 定义文件类型指针的普通方式:定义文件类型指针的普通方式:FILE *指针变量名;指针变量名;C编译系统定义的一种构造体类型,编译系统定义的一种构造体类型,其中的成员用于存放有关文件的一其中的成员用于存放有关文件的一些信息文件名、文件形状和文件些信息文件名、文件形状和文件当前读写位置等当前读写位置等指针变量用于指向一个文件,指针变量用于指向一个文件,实践上是用于存放文件缓冲区实践上是用于存放文件缓冲区的首地址。的首地址。 FILE构造体是在头文件构造

7、体是在头文件中定义的,对文件操作的程中定义的,对文件操作的程序,在最前面都应写上文件包含命令:序,在最前面都应写上文件包含命令: #include C言语经过文件指针变量对文件进展翻开、读、写及封锁操作。言语经过文件指针变量对文件进展翻开、读、写及封锁操作。第9章 文件操作 7FILE构造体类型在头文件构造体类型在头文件stdio.h中定义如下:中定义如下:typedef structshort level;/*文件缓冲区占用程度文件缓冲区占用程度*/unsigned flags; /*文件形状标志文件形状标志*/char fd;/*文件描画符文件描画符*/unsigned char hold

8、;/*假设无缓冲区不读取字符假设无缓冲区不读取字符*/short bsize;/*文件缓冲区大小文件缓冲区大小*/unsigned char *buffer;/*数据缓冲区的位置数据缓冲区的位置*/unsigned char *curp;/*指针当前的位置指针当前的位置*/unsigned istemp; /*暂时文件指示器暂时文件指示器*/short token;/*用于操作有效性检查用于操作有效性检查*/ FILE;/*文件类型符文件类型符*/9.1.3 文件类型指针文件类型指针在编程时不用关怀在编程时不用关怀FILE构造的详细细节,只需在运用构造的详细细节,只需在运用I/O函数函数时用这

9、个文件指针变量来指定所操作的文件。时用这个文件指针变量来指定所操作的文件。第9章 文件操作 89.1.3 文件类型指针文件类型指针在在C言语程序中运用文件,需求完成以下任务:言语程序中运用文件,需求完成以下任务:1声明一个声明一个FILE类型的文件指针变量;类型的文件指针变量;2翻开文件:翻开文件:调用调用fopen函数将此文件指针变量和某一个实践的磁盘函数将此文件指针变量和某一个实践的磁盘文件相联络。要求指定文件名,并且阐明对该文件是输文件相联络。要求指定文件名,并且阐明对该文件是输入操作还是输出操作。入操作还是输出操作。3读写文件:读写文件:调用适当的文件操作函数完成必要的调用适当的文件操

10、作函数完成必要的I/O操作。操作。对输入文件来说,函数从文件中将数据读取至程序中;对输入文件来说,函数从文件中将数据读取至程序中;对输出文件来说,函数将程序中的数据转移到文件中去。对输出文件来说,函数将程序中的数据转移到文件中去。4封锁文件:封锁文件:调用调用fclose函数阐明文件操作终了,断开文件指针与实函数阐明文件操作终了,断开文件指针与实践文件之间的联络。践文件之间的联络。第9章 文件操作 99.2 文件的翻开与封锁文件的翻开与封锁 9.2.1 文件的翻开文件的翻开 翻开文件,实践上翻开文件,实践上是建立文件的各种有是建立文件的各种有关信息,并使文件指关信息,并使文件指针指向该文件;针

11、指向该文件;缓冲文件系统借助缓冲文件系统借助文件指针来对文件进文件指针来对文件进展管理和访问,既可展管理和访问,既可以读写字符、字符串、以读写字符、字符串、格式化数据,也可以格式化数据,也可以读写二进制数据。读写二进制数据。“文件名和文件名和“文件翻开方式都文件翻开方式都是字符串常量或字符数组。是字符串常量或字符数组。文件指针名文件指针名=fopen(文件名文件名,文件翻开方式文件翻开方式)需求翻开的需求翻开的文件的名字文件的名字确定文件的确定文件的数据操作方式数据操作方式翻开文件运用函数翻开文件运用函数fopen其调用的普通方式为:其调用的普通方式为:第9章 文件操作 10举举 例例 FIL

12、E *fp; fp=fopen(source.txt,r); 作用:作用: 以读的方式以读的方式“r r方式即表示读方式即表示读“readread翻开当前翻开当前目录下文件名为目录下文件名为source.txtsource.txt的文件。的文件。 假设翻开文件胜利,那么前往一个指向假设翻开文件胜利,那么前往一个指向source.txtsource.txt文文件信息区的起始地址的指针,并赋值给件信息区的起始地址的指针,并赋值给fpfp,即,即fpfp指向指向了文件了文件source.txtsource.txt。其后一切对该文件的操作都必需。其后一切对该文件的操作都必需经过经过fpfp指针来实现。

13、指针来实现。 假设文件翻开失败,那么前往一个空指针假设文件翻开失败,那么前往一个空指针NULLNULL,赋值,赋值给给fpfp。 阐明:阐明: 文件名可以包含途径和文件名两部分。文件名可以包含途径和文件名两部分。 写途径时,由于本义字符以反斜杠开头,所以写途径时,由于本义字符以反斜杠开头,所以“才是表示一个反斜杠。才是表示一个反斜杠。 【例】假设途径和文件名为:【例】假设途径和文件名为:“c:tcsource.txtc:tcsource.txt,那么应写成那么应写成“c:tcsource.txtc:tcsource.txt。第9章 文件操作 119.2.1 文件的翻开文件的翻开 文件的翻开方式

14、文件的翻开方式模式字符串模式字符串 意意 义义 r 以以只读方式只读方式打开一个打开一个文本文件文本文件,只允许读数据,只允许读数据w以以只写只写方式打开或建立一个方式打开或建立一个文本文件文本文件,只允许写数据,只允许写数据a以以追加追加方式打开一个方式打开一个文本文本文件,并在文件文件,并在文件末尾末尾写数据写数据r+以以读写读写方式打开一个方式打开一个文本文本文件,允许读和写文件,允许读和写w+以以读写读写方式打开或建立一个方式打开或建立一个文本文本文件,允许读写文件,允许读写a+ 以以读写读写方式打开一个方式打开一个文本文本文件,允许读,或在文件末追加数文件,允许读,或在文件末追加数

15、rb 以以只读只读方式打开一个方式打开一个二进制文件二进制文件,只允许读数据,只允许读数据 wb 以只写方式打开或建立一个二进制文件,只允许写数据以只写方式打开或建立一个二进制文件,只允许写数据 ab 以追加方式打开一个二进制文件,并在文件末尾写数据以追加方式打开一个二进制文件,并在文件末尾写数据 rb+ 以读写方式打开一个二进制文件,允许读和写以读写方式打开一个二进制文件,允许读和写 wb+ 以读写方式打开或建立一个二进制文件,允许读和写以读写方式打开或建立一个二进制文件,允许读和写 ab+ 以读写方式打开一个二进制文件,允许读,或在文件末追加数据以读写方式打开一个二进制文件,允许读,或在文

16、件末追加数据 第9章 文件操作 129.2.1 文件的翻开文件的翻开-方式阐明方式阐明 1 1“r r方式:方式:只能用于输入读操作,且只能翻开一个曾经存在的文件。只能用于输入读操作,且只能翻开一个曾经存在的文件。 2 2“w w方式:方式:只能用于输出写操作。只能用于输出写操作。假设指定的文件不存在,那么新建一个文件;假设指定的文件不存在,那么新建一个文件;假设文件存在,那么把原来的文件删除,再重新建立一个空白假设文件存在,那么把原来的文件删除,再重新建立一个空白的文件。的文件。 3 3“a a方式:方式:用于追加操作。用于追加操作。假设指定的文件不存在,那么新建该文件;假设指定的文件不存在

17、,那么新建该文件;假设文件存在,保管该文件原有的数据,在原文件的末尾添加假设文件存在,保管该文件原有的数据,在原文件的末尾添加新的数据。新的数据。 4 4翻开方式带上翻开方式带上“b b表示是对二进制文件进展操作。带上表示是对二进制文件进展操作。带上“+ +表示既可以读,又可以写。而对待文件存在与否的不同处表示既可以读,又可以写。而对待文件存在与否的不同处置那么按照置那么按照“r r、“w w、“a a各自的规定。各自的规定。5 5假设在翻开文件时发生错误,即翻开失败,假设在翻开文件时发生错误,即翻开失败,fopenfopen前往一个前往一个空指针空指针NULLNULL。 第9章 文件操作 1

18、3 文件翻开能够出现的错误有:文件翻开能够出现的错误有: 试图以试图以“读方式带读方式带“r的方式翻开一个并不存在的文件;的方式翻开一个并不存在的文件; 试图以试图以“写方式带写方式带“w或或“a的方式、的方式、“r+或或“rb+方方式翻开被设置为式翻开被设置为“只读属性的文件。只读属性的文件。 新建一个文件,而磁盘上没有足够的剩余空间或磁盘被写维护。新建一个文件,而磁盘上没有足够的剩余空间或磁盘被写维护。 用不正确的方式翻开一个文件能够会破坏文件的内容。用不正确的方式翻开一个文件能够会破坏文件的内容。 为防止因上述缘由的出错,常用以下的方法来翻开一个文件:为防止因上述缘由的出错,常用以下的方

19、法来翻开一个文件:9.2.1 文件的翻开文件的翻开-方式阐明方式阐明 if(fp=fopen(source.txt,r)=NULL) printf(This file could not be opened !n); exit(0) /*前往操作系统前往操作系统*/ else /*此处编写对文件读此处编写对文件读/写的代码写的代码*/ #include 第9章 文件操作 149.2 文件的翻开与封锁文件的翻开与封锁 9.2.2 文件的封锁文件的封锁【例】【例】fclose(fp)封锁由指针封锁由指针fp指定的文件,同时根据需求刷新缓冲区。指定的文件,同时根据需求刷新缓冲区。假设文件胜利封锁,假

20、设文件胜利封锁,fclose函数将前往值函数将前往值0,否那么前往,否那么前往EOF。 fclose(文件指针变量文件指针变量);对文件的操作完成后,应确保封锁程序中翻开的文件,以对文件的操作完成后,应确保封锁程序中翻开的文件,以防止文件的数据丧失。防止文件的数据丧失。 封锁文件指断开指针与文件之间的联络,也就制止再对该封锁文件指断开指针与文件之间的联络,也就制止再对该文件进展操作。文件进展操作。磁盘已满、磁盘被移走或者出现磁盘已满、磁盘被移走或者出现I/O错误等都会导致错误等都会导致fclose函函数执行失败。数执行失败。第9章 文件操作 159.2 文件的翻开与封锁文件的翻开与封锁 不封锁

21、文件能够会丧失数据不封锁文件能够会丧失数据磁盘文件磁盘文件输出文件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区程序数据区程序数据区a缓冲文件系统:缓冲文件系统:fclose第9章 文件操作 169.3 文件的读写文件的读写 运用运用fopen胜利翻开文件后,都会有属于该文件的一个胜利翻开文件后,都会有属于该文件的一个文件读写位置指针,表示文件内部即将要读写的位置。文件读写位置指针,表示文件内部即将要读写的位置。 文件指针和文件内部的读写位置指针是不同的文件指针和文件内部的读写位置指针是不同的9.3.1 文件读写函数概述文件读写函数概述字符读写函数:字符读写函数: fgetc()和和fput

22、c()字符串读写函数:字符串读写函数:fgets()和和fputs()数据块读写函数:数据块读写函数:freed()和和fwrite()格式化读写函数:格式化读写函数:fscanf()和和fprinf()文本文件文本文件二进制文件二进制文件第9章 文件操作 179.3 文件的读写文件的读写 文件指针和文件内部的读写位置指针是不同的文件指针和文件内部的读写位置指针是不同的 文件指针指向整个文件,在程序中定义,只需不重新文件指针指向整个文件,在程序中定义,只需不重新赋值,文件指针的值不变。赋值,文件指针的值不变。 文件内部的读写位置指针用于指示文件内部的当前读文件内部的读写位置指针用于指示文件内部

23、的当前读写位置,每读写一次,该指针均自动向后挪动,指向写位置,每读写一次,该指针均自动向后挪动,指向下一个读写单元。它不需在程序中定义,由系统自动下一个读写单元。它不需在程序中定义,由系统自动设置。设置。 以以“r或或“w方式翻开文件后,该文件读写位置指方式翻开文件后,该文件读写位置指针初始值指向文件开头;针初始值指向文件开头; 以以“a方式翻开文件后,该文件读写位置指针初始值方式翻开文件后,该文件读写位置指针初始值指向文件末尾。指向文件末尾。第9章 文件操作 189.3 文件的读写文件的读写 对文件进展读写操作时,需求判别当前读写位置,假设对文件进展读写操作时,需求判别当前读写位置,假设文件

24、读操作到最后,再进展读写操作就会出错。文件读操作到最后,再进展读写操作就会出错。 为了防止出错,为了防止出错,C提供了下面的方式判别文件能否读完提供了下面的方式判别文件能否读完 1、对于文本文件,终了标志是、对于文本文件,终了标志是EOF即即-1,在,在stdio.h中中定义,可以经过读取的字符是不是终了标志来判别文本定义,可以经过读取的字符是不是终了标志来判别文本文件能否读完;文件能否读完; 2、对于二进制文件,没有、对于二进制文件,没有EOF的终了标志,只能运用系的终了标志,只能运用系统提供的统提供的feof函数来判别;函数来判别; 其中,其中,fp是文件指针变量,假设文件读取终了那么前往

25、是文件指针变量,假设文件读取终了那么前往非非0值,没终了前往值,没终了前往0值。值。 3、文本文件可运用、文本文件可运用feof函数按上面方式来判别能否读取函数按上面方式来判别能否读取终了。终了。 while( !feof(fp) /*此处写入读操作语句此处写入读操作语句*/ 运用格式是:运用格式是: feof(fp)第9章 文件操作 199.3 文件的读写文件的读写 9.3.2 字符读写函数字符读写函数1字符读函数字符读函数fgetc( )功能:从指定的文件中读一个字符;功能:从指定的文件中读一个字符;函数调用的普通方式:函数调用的普通方式: 字符变量字符变量=fgetc(文件指针变量文件指

26、针变量);【例】【例】 ch=fgetc(fp1); /*从从fp1指向的文件中读取一个字符并送入变量指向的文件中读取一个字符并送入变量ch中中*/阐明:阐明:在在fgetc函数调用中,读取的文件必需是以读或读写方式翻开的函数调用中,读取的文件必需是以读或读写方式翻开的读取胜利前往文件当前位置的一个字符;读取胜利前往文件当前位置的一个字符;读错误时前往读错误时前往EOF。第9章 文件操作 209.3 文件的读写文件的读写 9.3.2 字符读写函数字符读写函数2字符写函数字符写函数fputc( )功能:将一个字符写入到指定文件中;功能:将一个字符写入到指定文件中;函数调用的普通方式:函数调用的普

27、通方式: fputc(字符变量,文件指针变量字符变量,文件指针变量);【例】【例】 fputc(ch,fp2); /* 将字符变量将字符变量ch中的字符写入到中的字符写入到fp2所指的文件中所指的文件中 */阐明:阐明:fputc函数也有前往值函数也有前往值假设写操作胜利,那么前往向文件所写的字符;假设写操作胜利,那么前往向文件所写的字符;否那么前往否那么前往EOF,表示写操作失败。,表示写操作失败。 第9章 文件操作 21例例 9-1 用依次读取字符的方式,将用依次读取字符的方式,将source.txt文件的内容复制到文件的内容复制到destination.txt文件中。文件中。9.3 文件

28、的读写文件的读写 void main() FILE *fp1,*fp2; char 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章 文件操作 229.3.3 字符串读写函

29、数字符串读写函数1字符串读函数字符串读函数fgets( )功能:从指定的文件中读取一个字符串到程序中的字符数组功能:从指定的文件中读取一个字符串到程序中的字符数组函数调用的普通方式:函数调用的普通方式: 参数参数n是一个正整数,表示从文件中读出的字符串不超越是一个正整数,表示从文件中读出的字符串不超越n-1个个字符。由于要在读入的最后一个字符后加上字符串终了标志字符。由于要在读入的最后一个字符后加上字符串终了标志0。阐明:阐明:fgets函数从文件中读取字符直到遇见回车符或函数从文件中读取字符直到遇见回车符或EOF为止,或直为止,或直到读入了所限定的字符数至多到读入了所限定的字符数至多n-1个

30、字符为止。个字符为止。函数读胜利前往字符数组首地址;失败前往空指针函数读胜利前往字符数组首地址;失败前往空指针NULL。9.3 文件的读写文件的读写 fgets(字符数组名字符数组名,n ,文件指针文件指针);第9章 文件操作 239.3.2 字符读写函数字符读写函数2字符串写函数字符串写函数fputs( )功能:将一个字符串写入到指定文件中功能:将一个字符串写入到指定文件中函数调用的普通方式:函数调用的普通方式: 字符串可以是字符串常量,也可以是字符数组名,或字符指针字符串可以是字符串常量,也可以是字符数组名,或字符指针变量。变量。【例】【例】char *ch=You Are Good! f

31、puts(ch,fp2); /* 将字符指针将字符指针ch指向的字符串写入到文件指向的字符串写入到文件fp2中中 */阐明:阐明:假设函数调用假设函数调用fputs前往值为前往值为EOF时,阐明写操作失败。时,阐明写操作失败。 9.3 文件的读写文件的读写 fputs(字符串字符串,文件指针文件指针)第9章 文件操作 24 例例9-2 修正例修正例9-1程序,用读取字符串的方式,将程序,用读取字符串的方式,将source.txt文文件的内容复制到件的内容复制到destination.txt文件中。文件中。9.3 文件的读写文件的读写 void main() FILE *fp1,*fp2; ch

32、ar ch80; 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(!feof(fp1) fgets(ch,81,fp1); fputs(ch,fp2); fclose(fp1); fclose(fp2); 第9章 文件操作 259.3 文件的读写文件的读写 字符读写函数:字符读写函数: fgetc()和和

33、fputc() 字符串读写函数:字符串读写函数:fgets()和和fputs() 格式读写函数:格式读写函数: fscanf()和和fprintf() 数据块读写函数:数据块读写函数:fread()和和fwrite()第9章 文件操作 269.3.4 格式读写函数格式读写函数1格式化读函数格式化读函数fscanf功能:从指定的文件中按照一定的格式读取数据到程序中功能:从指定的文件中按照一定的格式读取数据到程序中fscanf与与scanf功能类似,区别在于功能类似,区别在于fscanf的读取对象是磁盘文的读取对象是磁盘文件,件,scanf的读取对象是键盘。的读取对象是键盘。函数调用的普通方式:函

34、数调用的普通方式:其中,格式字符串和输入表列和其中,格式字符串和输入表列和scanf函数类似。函数类似。【例】【例】fscanf(fp,%5d,&ai);阐明:阐明:函数的前往值假设为函数的前往值假设为EOF,阐明格式化读错误;否那么读数,阐明格式化读错误;否那么读数据胜利。据胜利。9.3 文件的读写文件的读写 fscanf(文件指针文件指针,格式字符串格式字符串,输入表列输入表列);第9章 文件操作 272格式化写函数格式化写函数fprintf功能:把格式化的数据写到指定文件中功能:把格式化的数据写到指定文件中fprintf与与printf功能类似,区别在于功能类似,区别在于fprintf是

35、向文件中输出,而是向文件中输出,而printf是向屏幕输出。是向屏幕输出。函数调用的普通方式:函数调用的普通方式: 其中,格式控制字符串和输出项列表和其中,格式控制字符串和输出项列表和printf函数类似。函数类似。【例】【例】 fprintf(fp,%5d,ai);阐明:阐明:函数的前往值为实践写入文件中的字符个数字节数;函数的前往值为实践写入文件中的字符个数字节数;假设写错误,那么前往一个负数。假设写错误,那么前往一个负数。 9.3 文件的读写文件的读写 9.3.4 格式读写函数格式读写函数fprintf(文件指针文件指针,格式控制字符串格式控制字符串,输出项列表输出项列表);第9章 文件

36、操作 28 例例9-3 随机产生随机产生20个个10,99之间的整数,以每行之间的整数,以每行5个数据输个数据输出到文本文件出到文本文件c:data.txt中,要求每个数据占中,要求每个数据占5个宽度,并且数个宽度,并且数据之间用逗号分隔。然后将其读出按升序排序后,按同样格式据之间用逗号分隔。然后将其读出按升序排序后,按同样格式追加写在原文件后,与原数据之间空出追加写在原文件后,与原数据之间空出2行。行。 编程分析:编程分析: 采用模块化程序设计采用模块化程序设计 将产生数据、将数据输出到文件、从文件中读取数据,排序将产生数据、将数据输出到文件、从文件中读取数据,排序和追加数据到文件分别写成和

37、追加数据到文件分别写成GetData( )、PutDataToFile( )、GetDataFormFile( )和和sort( )、AppendDataToFile( )函数函数 9.3 文件的读写文件的读写 第9章 文件操作 29void main() int a20,i; GetData(a,20); PutDataToFile(a,20); /*调用调用scandata()函数将数据读入到数组函数将数据读入到数组a中中*/ GetDataFormFile(a,20); sort(a,20); /*调用调用sort()函数将数组函数将数组a的数据排序的数据排序*/ /*调用调用Apped

38、DataToFile( ) 函数将排序后的数组函数将排序后的数组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 文件的读写文件的读写 第9章 文件操作 30void PutDataToFile(int a,int n) int i; OpenFile(c:data.txt,w); f

39、or(i=0;in;i+) if(i%5=0) fprintf(fp,%5d,ai); else fprintf(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,&ai); /* 每每1行的第行的第1个数据前不用逗号个数据前不用逗号 */ else fscanf(fp,,%5d,&ai); f

40、close(fp); 9.3 文件的读写文件的读写 第9章 文件操作 31void sort(int a,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jaj)k=j; t=ai; ai=ak; ak=t; void OpenFile(char *file,char *pr) if(fp=fopen(file,pr)=NULL)/* 翻开文件失败翻开文件失败 */ printf(Cannot open file,stike any key to exit!); exit(0);/* 退出程序退出程序 */ 9.3 文件的读写文件的读写

41、第9章 文件操作 32void 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); else fprintf(fp,%5d,ai); if(i+1)%5=0) fprintf(fp,n); fclose(fp);9.3 文件的读写文件的读写 第9章 文件操作 33#include #define

42、STUNUM 5 /*代表学生人数代表学生人数*/#define COURSENUM 3 /*代表课程门数代表课程门数*/struct student int sno; /*学号学号*/ char sname10; /*学生姓名学生姓名*/ int scoreCOURSENUM; /*每个学生的三门课成果每个学生的三门课成果*/stu1STUNUM,stu2STUNUM; 例例9-4 从键盘输入从键盘输入5个学生的学号、姓名和成果,将学生数据个学生的学号、姓名和成果,将学生数据写入文件,然后再从文件中将这些信息读出显示在屏幕上。写入文件,然后再从文件中将这些信息读出显示在屏幕上。 9.3 文件

43、的读写文件的读写 第9章 文件操作 34void 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,&stu1i.sno); scanf(%s ,stu1i.sname); for(j=0;jCOURSENUM;j+) scanf(%d,&stu1i.scorej); 9.3 文件的读写文件的读写

44、 第9章 文件操作 35for(i=0;iSTUNUM;i+)/*学生数据写入文件中学生数据写入文件中*/ fprintf(fp,%d,stu1i.sno); fprintf(fp,%s,stu1i.sname); for(j=0;jCOURSENUM;j+) fprintf(fp,%d,stu1i.scorej); rewind(fp);/*文件的位置指针挪动到文件开场处文件的位置指针挪动到文件开场处*/ for(i=0;iSTUNUM;i+) /*将文件中学生数据读入程序中将文件中学生数据读入程序中*/ fscanf(fp,%d,&stu2i.sno); fscanf(fp,%s,stu2

45、i.sname); for(j=0;jCOURSENUM;j+) fscanf(fp,%d,&stu2i.scorej); 9.3 文件的读写文件的读写 第9章 文件操作 36 printf(nsnotsnamettscoresn); for(i=0;iSTUNUM;i+) /*将读出的数据显示在屏幕将读出的数据显示在屏幕上上*/ printf(%dt,stu2i.sno); printf(%st,stu2i.sname); for(j=0;jCOURSENUM;j+) printf(%dt,stu2i.scorej); printf(n); fclose(fp); 9.3 文件的读写文件的读

46、写 第9章 文件操作 379.3.5 数据块读写函数数据块读写函数1读取数据块函数读取数据块函数fread功能:从指定文件中读取假设干个数据块到程序中功能:从指定文件中读取假设干个数据块到程序中函数调用的普通方式为:函数调用的普通方式为:参数参数buffer是一个指针,表示存放输入数据的内存存储是一个指针,表示存放输入数据的内存存储地址;地址;参数参数size表示一个数据块的字节数;表示一个数据块的字节数;参数参数count表示要读写的数据块块数。表示要读写的数据块块数。 9.3 文件的读写文件的读写 fread(buffer,size,count,fp);第9章 文件操作 389.3.5 数

47、据块读写函数数据块读写函数2写数据块函数写数据块函数fwrite功能:将假设干个数据块写入到指定的文件中功能:将假设干个数据块写入到指定的文件中函数调用的普通方式为:函数调用的普通方式为:参数参数buffer是一个指针,表示存放输出数据的内存存储是一个指针,表示存放输出数据的内存存储地址;地址;参数参数size表示一个数据块的字节数;表示一个数据块的字节数;参数参数count表示要读写的数据块块数。表示要读写的数据块块数。 9.3 文件的读写文件的读写 fwrite(buffer,size,count,fp);第9章 文件操作 39#include #define STUNUM 5 /*代表学

48、生人数代表学生人数*/#define COURSENUM 3 /*代表课程门数代表课程门数*/struct student int sno;/*学号学号*/ char sname10;/*学生姓名学生姓名*/ int scoreCOURSENUM;/*每个学生的每个学生的3门课成果门课成果*/stu1STUNUM,stu2STUNUM; 例例9-5 改写例改写例9-4运用数据块读写函数从键盘输入运用数据块读写函数从键盘输入5个学生的学个学生的学号、姓名和成果,将学生数据写入文件,然后再从文件中将这些号、姓名和成果,将学生数据写入文件,然后再从文件中将这些信息读出显示在屏幕上。信息读出显示在屏幕

49、上。9.3 文件的读写文件的读写 第9章 文件操作 40void 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,&stu1i.sno); scanf(%s ,stu1i.sname); for(j=0;jCOURSENUM;j+) s

50、canf(%d,&stu1i.scorej); 9.3 文件的读写文件的读写 第9章 文件操作 41 fwrite(stu1,sizeof(struct student), STUNUM,fp); /*学生数据写入文件中学生数据写入文件中*/ rewind(fp); /*文件的位置指针挪动到文件开场处文件的位置指针挪动到文件开场处*/ fread(stu2,sizeof(struct student), STUNUM,fp); /*将文件中数据读入程序中将文件中数据读入程序中*/ printf(nsno tttsnametscores n); for(i=0;iSTUNUM;i+) /*将读出

51、的数据显示在屏幕上将读出的数据显示在屏幕上*/ printf(%dt,stu2i.sno); printf(%st,stu2i.sname); for(j=0;j0 0 向后挪动;向后挪动; 0 0 向前挪动;向前挪动; =0 =0坚持不动坚持不动起始点起始点文件开场文件开场 SEEK_SET 0 SEEK_SET 0文件当前位置文件当前位置 SEEK_CUR 1 SEEK_CUR 1文件末尾文件末尾 SEEK_END 2 SEEK_END 2例例 fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2); fseek函数函数9.3 文件的读写文件

52、的读写 第9章 文件操作 44 ftell函数:函数:long ftell(FILE *stream); 前往文件读写位置指针的当前值,这个值是前往文件读写位置指针的当前值,这个值是从文件头开场算起到文件指针位置的字节数,从文件头开场算起到文件指针位置的字节数,前往的数为长整型数;前往的数为长整型数; 假设前往假设前往-1,阐明出现错误。,阐明出现错误。 rewind函数:函数:int rewind(FILE *stream); 用于将文件内部的读写位置指针挪动到文件用于将文件内部的读写位置指针挪动到文件的开场处;的开场处; 胜利时前往胜利时前往0;否那么,前往非;否那么,前往非0值。值。9.

53、3 文件的读写文件的读写 第9章 文件操作 45#include #define STUNUM 5/*代表学生人数代表学生人数*/#define COURSENUM 3/*代表课程门数代表课程门数*/struct student int sno;/*学号学号*/ char sname10;/*学生姓名学生姓名*/ int scoreCOURSENUM;/*每个学生的三门课成果每个学生的三门课成果*/ stu; void main() FILE *fp; int i; if(fp=fopen(c:stu.dat,rb)=NULL) printf(File could not be opened!

54、n); exit(0); 例例9-6 从例从例9-5所建立的文件所建立的文件c:stu.dat中读取第中读取第2个个学生的一切信息并显示在屏幕上。学生的一切信息并显示在屏幕上。 9.3 文件的读写文件的读写 第9章 文件操作 46 fseek(fp,1L*sizeof(struct student),SEEK_SET); /* 文件位置指针挪动到第一个学生数据之后文件位置指针挪动到第一个学生数据之后 */ fread(&stu,sizeof(struct student),1,fp); /*将文件中该学生数据读入变量中将文件中该学生数据读入变量中*/ printf(nsnotscoresttt

55、snamen); /*将读出的学生数据显示在屏幕上将读出的学生数据显示在屏幕上*/ printf(%dt,stu.sno); printf(%sn,stu.sname); for(i=0;iCOURSENUM;i+) printf(%dt,stu.scorei); fclose(fp);9.3 文件的读写文件的读写 本章终了本章终了第9章 文件操作 479.4 运用举例运用举例 9.4.1 9.4.1 文件的加密和解密文件的加密和解密例例9-8 设计一个对指定文件进展加密和解密的程序,设计一个对指定文件进展加密和解密的程序,密码和文件名由用户输入。密码和文件名由用户输入。【加密方法】【加密方法

56、】以二进制翻开文件,将密码中每个字符的以二进制翻开文件,将密码中每个字符的ASCII码值码值与文件的每个字节进展异或运算,然后写回原文件原与文件的每个字节进展异或运算,然后写回原文件原位置即可。这种加密方法是可逆的,即对明文进展加位置即可。这种加密方法是可逆的,即对明文进展加密得到密文,用一样的密码对密文进展加密就得到明密得到密文,用一样的密码对密文进展加密就得到明文。此方法适宜各种类型的文件加密解密。文。此方法适宜各种类型的文件加密解密。 下面用两种方法实现对文件的加密和解密。下面用两种方法实现对文件的加密和解密。 第9章 文件操作 489.4 运用举例运用举例 方法一:程序运转后,用户在提

57、示下输入文件名和密方法一:程序运转后,用户在提示下输入文件名和密码。码。编辑分析:由于涉及到文件的读和写,采用逐个字节编辑分析:由于涉及到文件的读和写,采用逐个字节从原文件中读出,加密后写入一个新建的暂时文件,从原文件中读出,加密后写入一个新建的暂时文件,最后,删除原文件,把暂时文件改名为原文件名,完最后,删除原文件,把暂时文件改名为原文件名,完成操作。成操作。 #include #include char encrypt(char f, char c) /*字符加密函数字符加密函数*/ return f c; /*前往两字符前往两字符ASCII码按位做异或运算的结果码按位做异或运算的结果*/

58、第9章 文件操作 49void 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)=NULL|(fp1=fopen(tm,wb)=NU

59、LL) printf(Cannot open file strike any key exit!); exit(0);/ 退出退出 printf(Input the password:); gets(s); / 输入密码输入密码9.4 运用举例运用举例 第9章 文件操作 50 ch=fgetc(fp); while(!feof(fp)/当原文件没读完时当原文件没读完时 s=ps; /从密码的第一个字符开场处置从密码的第一个字符开场处置 while(*s!= 0) ch=encrypt(ch, *s+); /调用函数加密,让调用函数加密,让s指向下一个密码字符指向下一个密码字符 fputc(ch

60、, fp1); / 把加密后的字节写入暂时文件把加密后的字节写入暂时文件 ch=fgetc(fp); / 读入一个字节读入一个字节 fclose(fp); fclose(fp1); remove(p); / 删除原文件删除原文件 rename(tm, p); / 把暂时文件改名为原文件名把暂时文件改名为原文件名 9.4 运用举例运用举例 第9章 文件操作 51方法二:将要加密的文件和密码,经过命令行参数传送给程序,方法二:将要加密的文件和密码,经过命令行参数传送给程序,并且加密解密过程对文件的读写采有随机读写,不建立暂时文并且加密解密过程对文件的读写采有随机读写,不建立暂时文件,程序代码如下:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论