收藏 分享(赏)

第10章 文件2.ppt

上传人:hyngb9260 文档编号:7712817 上传时间:2019-05-24 格式:PPT 页数:34 大小:503KB
下载 相关 举报
第10章 文件2.ppt_第1页
第1页 / 共34页
第10章 文件2.ppt_第2页
第2页 / 共34页
第10章 文件2.ppt_第3页
第3页 / 共34页
第10章 文件2.ppt_第4页
第4页 / 共34页
第10章 文件2.ppt_第5页
第5页 / 共34页
点击查看更多>>
资源描述

1、C语言程序设计,C程序设计入门 C程序的控制结构 函数与程序结构 指针与函数 数组及应用 字符串及其应用 指针与数组 结构体类型和联合体类型 位运算与枚举类型 文件,文件,文件概念与文件类型指针 文件的打开与关闭 文件的读写 文件的定位和随机读写,文件概念与文件类型指针,数据的层次结构依赖于计算机系统内存的数据可以称之为内存数据,对其的使用只能通过计算机程序在计算机系统的内存储器中进行,这类数据的生存周期最多与程序的运行时间相当。 外存储器中的数据不能被计算机系统直接处理,任何数据能够被处理的首要条件是进入计算机系统的内存储器。所以,外存数据必须与内存数据配合才能得到应用。,文件概念与文件类型

2、指针,文件的概念 程序设计中使用文件的目的 将数据永久地保存在计算机外部存储介质上,使之成为可以共享的信息,即通过文件系统与其他信息处理系统联系; 可以进行大量的原始数据的输入和保存,以适应计算机系统在各方面的应用。 文件的基本概念文件是具有一个有名字的、存储在某种介质上的、相关信息的集合。这些信息可以是一批二进制数、一组数据、一个程序;也可以是其他信息形式,如:图形、图象、声音等等;它甚至包含所有的计算机外部设备,这样的文件称为“设备文件”。,文件概念与文件类型指针,文件的概念 按文件的结构形式分类 二进制文件。内存中的数据按其在内存中的存储形式原样存放到计算机外部存储设备,这类文件可以节省

3、计算机外存空间。 文本文件。文本文件是全部由字符组成的具有行列结构的文件,即文件的每个元素都是字符或换行符。 按文件的读写方式分类 顺序存取文件。C语言中对文件的读写是以字符或字节为单位,输入输出数据流的开始和结束都受程序的控制而不是受回车换行符的控制。 随机存取文件。对文件任一元素的读写不必象顺序文件那样从头开始。,文件概念与文件类型指针,文件的概念 按文件存储的外部设备分类 磁盘文件。在程序的运行过程中,通常需要将一些数据信息输出到磁盘上保存起来,需要的时候再从磁盘中将其输入到内存进行处理,这种保存在磁盘上的文件称为磁盘文件。 设备文件。在C程序的设计中,将所有的计算机系统外部设备都作为文

4、件对待,这样的文件称为设备文件。,文件概念与文件类型指针,文件的概念 按系统对文件的处理方法分类 缓冲文件系统。缓冲文件系统是指系统自动地在内存中为每一个正在使用的文件开辟一个缓冲区。向文件中写入数据或者从文件中读出数据到应用程序中均须通过文件缓冲区进行。 非缓冲文件系统。所谓非缓冲文件系统是指系统不自动为程序开辟确定大小的文件缓冲区,而由程序为用到的每个文件设置缓冲区。 ANSI C标准(1983年)决定放弃采用非缓冲文件系统而只使用缓冲文件系统,即使用缓冲文件系统同时处理文本文件和二进制文件。,文件概念与文件类型指针,文件的概念 对文件缓冲区处理信息的保存缓冲文件系统中,对文件的处理都是通

5、过在内存中开辟一个缓冲区来存取文件的相关的信息,比如说文件的名字、文件的状态、文件读写指针的当前位置等等,这些关于文件处理的信息在整个文件处理的过程中必须妥善保存。在C程序设计语言中,用一个结构体类型的变量来保存这些信息,文件结构体类型由语言处理系统预先定义并命名为FILE。,Visual C+编译器中对FILE结构体类型定义如下: /* Definition of the control structure for streams*/ struct _iobuf char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;

6、int _bufsiz;char *_tmpfname; ; typedef struct _iobuf FILE; /FILE是系统定义的文件结构体类型名,文件概念与文件类型指针,文件的概念 缓冲文件系统的文件处理概念使用缓冲文件系统时,对任何一个正在处理的文件系统自动在系统内部定义一个FILE数据类型的结构体变量,将该文件的各种描述信息和控制信息存放在该结构体变量中。在程序设计中对这个结构体变量的操作是通过指向它的指针来进行的,程序员在文件处理的程序中定义一个FILE数据类型的指针,当建立或者打开文件时系统就自动建立一个FILE类型结构体变量并将将文件的有关信息赋给该变量,然后将该结构体变

7、量的地址赋给指定的文件类型(FILE类型)指针,建立起文件结构体变量与文件操作者之间的联系。程序员通过这个文件指针对该文件进行各种各样的操作。 文件类型指针变量的定义形式FILE *fp1,*fp2,*fpn;,文件,文件概念与文件类型指针 文件的打开与关闭 文件的读写 文件的定位和随机读写,文件的打开与关闭,文件处理的一般过程 打开(或者建立)要处理的文件; 按某种方式处理文件; 关闭文件; 文件的打开C程序设计语言(ANSI C)中提供了标准库函数fopen来实现打开(或建立)文件的操作。 fopen函数的使用方式 FILE *fpt; /*定义一个文件类型的指针变量fpt*/ fpt=f

8、open(file_name,file_mode);,文件的打开与关闭,文件的打开 打开(创建)操作中各项参数的意义 fpt为文件指针,用它指向被打开的文件以便进行文件操作; file_name是将要访问的文件的名字,可以使用值为字符串类型的变量或者用双引号括起来的字符串常量; file_mode为文件模式,用以规定文件可以操作的方式;,文件的打开与关闭,文件的打开fopen函数正常地打开或建立了指定文件时,将返回系统中建立的文件类型结构体变量的地址;若fopen函数没有正常地完成打开或建立文件的任务,则会带回一个出错信息并返回一个空指针值NULL。 if(fpt=fopen(file_nam

9、e,file_mode)=NULL) printf(“Cant open this file!n”);exit(0);,文件的打开与关闭,文件的关闭使用完文件后应及时地对文件进行关闭,及时关闭文件的理由至少有以下两点: 使用缓冲文件系统时,当文件缓冲区数据满后系统才会将数据写入文件。如果数据缓冲区未满而又不关闭文件就退出程序的运行,则会造成数据缓冲区内的数据丢失。 无论使用何种计算机系统,一个系统内能够同时打开的文件有一定的数量限制。如果不及时地关闭已经不使用的文件就有可能使得所有的文件句柄(文件号)被使用完,造成打开其他文件时出错。,文件的打开与关闭,文件的关闭 C语言中使用系统标准函数fc

10、lose实现文件的关闭。 调用形式fclose(文件指针); 功能将与指定文件指针相关联的文件关闭。系统在关闭文件时首先将对应文件缓冲区中还没有处理完的数据写回相对应的文件,然后释放与该指针对应的文件结构体变量,将资源归还系统。,文件,文件概念与文件类型指针 文件的打开与关闭 文件的读写 文件的定位和随机读写,文件的读写,缓冲文件系统中文件尾部的表示和检测方法 文件内部读写位置指针系统自动为打开的文件建立一个位置指针。文件读写位置指针用于在对文件的读写过程中指出了文件的当前读写位置。每次对文件进行了读或写之后,文件位置指针自动更新指向新的读写位置。 EOF 表示文本文件的文件尾标志(在输入流中

11、使用ctrl+z)。 feof函数 函数原型:int feof(FILE *stream); 函数功能:测试由stream所对应的文件内部记录指针是否移动到了文件结尾。当内部文件记录指针未到文件尾时,函数返回0值;当内部文件记录指针到达文件尾时,函数返回非0值。,文件的读写,单个字符数据的写操作 标准库函数fputc 函数原型int fputc(int c, FILE *stream); 函数功能 将用变量c表示的字符数据写到与文件指针stream相关联的文件中去,写入位置由文件的内部记录指针所指定,fputc函数执行成功时返回被输出的字符值,当函数执行发生错误时则返回EOF(-1)。例10-

12、1 将从键盘上输入的若干字符依次写入到文本文件mydat.txt中,要求文件的名字mydat.txt从命令行上带入。,文件的读写,单个字符数据的读操作 标准库函数fgetc 函数原型int fgetc(FILE *stream); 函数功能从与文件指针stream相关联的文件中读取一个字符(字节)数据,文件中的读取位置由文件的内部记录指针指定,fgetc函数执行成功时返回其读取的字符,当执行fgetc函数时遇到文件结束符或者在执行中出错时EOF(-1)。例10-2 将例10-1程序创建的文本文件mydat.txt中的字符数据读出并显示在屏幕上,要求文件的名字mydat.txt从命令行上带入并使

13、用标准库函数feof测试文件尾。,文件的读写,文件操作中单个字符读写标准库函数的简单应用例10-3 利用单个字符读写标准库函数实现文件拷贝功能,要求被拷贝的源文件和拷贝生成的目标文件的名字都从命令行上带入。例10-4 编程序实现统计文本文件中单词个数的功能,要求被统计文件名从命令行上带入。例10-5编制程序实现功能:统计一个(英文)文本文件中单词词频,并按词频的降序排序后输出所有单词,要求被统计文件名从命令行上带入。 问题分析统计文件(文章)中的词频是语言处理中常见的实际操作之一,针对本问题的程序设计过程中需要考虑下面几个问题: 表示单词和词频的数据结构 文件中单词个数的获取 动态生成结构体排

14、序数组 排序方法的选择,文件的读写,字符串数据的写操作 标准库函数fputs 函数原型int fputs(const char *s, FILE *stream); 函数功能将s所代表的字符串写入文件指针stream相关联的文件。函数fputs正常执行时返回写入文件中的字符个数,函数执行出错时返回值为EOF(-1)。例10-6 从键盘上读入若干行字符串并将它们存放到指定文件中,仅输入一个回车时结束输入过程,要求指定的文件名字从命令行上带入。,在使用标准库函数fputs是应该特别注意的是,函数在向文件中写入字符串时已经去掉了字符串的结尾标志0,因而连续写入的字符串不能被正确地分隔而成为了一个字符

15、串。为了使得写入文件中的字符串能够被正常地区别和处理,在使用fputs标准库函数向文件中写入字符串数据时每写入一个字串后要自行在其后添加一个分隔标志字符,为了与读字符串标准库函数fgets配合,使用换行符(n)作为分隔字符。,文件的读写,字符串数据的读操作 标准库函数fgets 函数原型char *fgets(char *s, int n, FILE *stream); 函数功能 从与文件指针stream 相关联的文件中最多读取n-1个字符,添加上字符0构成字符串后存放到s所代表的字符串对象中去。如果在读入n-1个字符前遇到换行符n或文件结束符EOF时操作也将结束,将遇到的换行符作为一个有效字

16、符处理,然后在读入的字符串末尾自动加上一个字符串结尾符0 后存放到s所代表的字符串对象中。函数fgets的返回值为s对象的首地址,若直接读到文件结尾标志或操作出错时则返回NULL。例10-7 将例10-6程序创建的文本文件中的字符串数据读出并显示在屏幕上,要求文件的名字从命令行上带入。,文件的读写,格式化数据的写操作 标准库函数fprintf 函数原型int fprintf (FILE *stream, const char *format, argument, .); 函数功能函数fprintf与格式化输出函数printf的功能基本相同,不同的是printf函数输出数据的目的地是标准输出设备

17、(显示器),而fprintf函数输出数据的目的地是由stream指定的文件,函数的返回值指出了函数正确写入文件中的字节数。例10-8 将某磁盘文件的所有行加上行号写入指定文件,两个文件的名字均从命令行带入。,文件的读写,格式化数据的读操作 标准库函数fscanf 函数原型int fscanf (FILE *stream, const char *format , address, .); 函数功能函数fscanf与格式化输入函数scanf的功能基本相同,不同的是scanf函数的数据来源于标准输入设备(键盘),而fscanf函数的数据来源于与stream相关联的文件,函数的返回值指出了函数正确处

18、理的数据项个数。例10-9 以10度为间隔,求出090度之间的所有正弦函数值、余弦函数值并将它们写入指定文件,然后再将这些数据读出并显示到屏幕上。,文件的读写,数据块的写操作 标准库函数fwrite 函数原型size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); 参数意义 buffer:参数buffer指定被写入文件的数据在内存储器中存储区域首地址。 size:参数size指定被写入文件的一个数据项的字节长度。 count:参数count指定一次函数操作(调用)写入长度为size的数据项个数。

19、stream:参数stream是与被处理文件相关联的文件类型指针变量,指出被操作的文件。,函数功能将内存储器中指定区域的数据块写入到与文件指针变量stream相关联的文件中,函数的返回值是该函数执行时正确写入文件中的数据项数(应该与count参数指出的相同),如果在写入操作中出现了错误则返回值小于count参数指出的写入数据项数。 例10-10 将一个108的整型二维数组的数据存入指定文件中(数组数据随机产生),要求文件名从命令行带入。,文件的读写,数据块的读操作 标准库函数fread 函数原型size_t fread( void *buffer, size_t size, size_t co

20、unt, FILE *stream ); 参数意义 buffer:buffer指定从文件中读入数据在内存储器存储区域中存放的首地址。 size:size指定从文件中读出的一个数据项的字节长度。 count:count指定一次函数操作(调用)从文件中读出长度为size的数据项个数。 stream:stream为与被处理文件相关联的文件类型指针变量,指出被操作的文件。,函数功能从与文件指针变量stream相关联的文件中按指定长度读取一个数据块到内存储器的指定区域,函数的返回 值是函数执行时正确从指定文件中读出的数据项数, 如果在读出操作中出现了错误则返回值小于count 参数指出的应读出数据项数。

21、 例10-11 将例10-10程序生成的数据文件内容读出并显示到屏幕上,要求文件名从命令行带入。,文件的读写,文件操作中数据块读写标准库函数的简单应用例10-12 单链表的存储和从指定文件中恢复单链表。本例程序在例8-13的基础上增加单链表的存储和恢复功能。具体要求为在菜单中添加两项命令:存储单链表和从指定文件中恢复单链表,并编制实现这两项功能的相应函数,例10-12程序在实现链表存储功能时没有考虑结点指针域的问题,因为在恢复链表时结点中的指针域值是没有用处的,所以在存放链表时没有必要将每个结点的指针域保存起来。在存放链表时不保存其结点的指针域可以节约大量的外存空间。,文件,文件概念与文件类型

22、指针 文件的打开与关闭 文件的读写 文件的定位和随机读写,文件的定位和随机读写,文件的操作位置指针和文件定位 文件的操作位置指针文件的操作位置指针即文件的内部记录指针,该指针指示的是文件操作的当前读写位置。在顺序文件操作方式下文件内部记录指针的移动和移动的距离都是文件系统自动处理的。 文件定位操作在文件的随机操作中,必须根据应用的需要确定文件内部记录指针移动的起始点和移动距离,这种根据需要移动文件内部记录指针到文件中指定位置称为文件定位操作。,文件的定位和随机读写,获取文件内部记录指针当前位置 标准库函数ftelle 函数原型long ftell( FILE *stream ); 函数功能获取

23、并返回由stream所关联文件的文件内部记录指针的当前位置与文件首部之间的距离,返回值用字节数表示;函数执行出错时返回-1。例10-13 利用读字符函数fgetc和ftell测试指定文件的字节长度,要求被处理文件名从命令行带入。,文件的定位和随机读写,重置文件内部记录指针 标准库函数rewind 函数原型void rewind( FILE *stream ); 函数功能 将由stream所关联文件的文件内部记录指针从任何位置重新拨回文件开头。例10-14 利用文件记录指针重置函数rewind将一个文件拷贝若干个备份,要求源文件名从命令行带入。,文件的定位和随机读写,设置文件内部记录指针 标准库

24、函数fseek 函数原型int fseek( FILE *stream, long offset, int origin ); 参数意义 stream:参数stream是一个文件类型指针变量,用以指定被设置内部记录指针的文件。offset,参数offset是长整型量,表示的文件内部记录指针的位移量,即前后移动的字节数; offset:参数offset是长整型量,表示文件内部记录指针移动的位移量,即前后移动的字节数。 origin,参数origin指定文件内部记录指针移动的起始位置,其取值和意义如表10-2所示。,文件的定位和随机读写,设置文件内部记录指针 标准库函数fseek 函数功能 将由s

25、tream所关联的文件的文件内部记录指针从whence指定的起始位置开始移动由offset指定的字节数,当参数offset为正值时向文件尾方向移动,当参数offset为负值时向文件头方向移动。例10-15 编程序测试指定文件的字节长度,要求利用fseek函数将文件内部记录指针移动到文件尾部。,文件的定位和随机读写,文件的随机读写在C程序设计中,实现随机读写的一般步骤如下: 通过某种方式求得要读写的起始位置和需读出的长度。 使用标准库函数fseek将文件的内部记录指针移动到计算出的起始位置。 使用标准库函数fread读出所需的数据项或使用标准库函数fwrite写入指定的数据项。例10-16 模仿操作系统的COPY命令,编制一个实现拷贝功能的程序,要求如下: 使用数据块拷贝的方式实现数据拷贝工作 源文件和目标文件的名字从命令行上带入,例10-17 文件中的字符串换:将文件内容中的英文字母按指定的模式进行转换(其中模式为L表示将大写字母转换为小写字母,模式为U表示将小写字母转换为大写字母),要求被转换的文件和转换模式均从命令行带入。,

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

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

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


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

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

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