C语言程序设计课件第11章(人民邮电出版社)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
章节自测及在线编程练习: http://cpp.injupt.com
高
级语 程
言
序
设
计
2009.8 朱立华 俞琼 王立柱
1
主讲人:朱立华
2009.8 朱立华 俞琼 王立柱
2
第十一章
流与文件
2009.8 朱立华 俞琼 王立柱
3
内容提要
本章介绍流与文件的有关知识 文件的几种读写方式 文件的随机访问方式 两种用程序实现文件复制的方法
2009.8 朱立华 俞琼 王立柱 14
文件的读写
根据文件读写操作涉及到的数Байду номын сангаас的类型和不同方式,分
四组介绍:
• • • •
字符的读写 字符串的读写 无格式读写 格式读写
(1)字符的读写:处理文本流(文本文件),文本流是字 结尾标志返回EOF
将字符c写入流,指针fp->curp后 ,。若成功则返回 fgetc移一个字节 从流中读取一个字符返回 , c, 否则返回 EOF(-1) 指针fp->curp 后移一个字节 ,读到
11
2009.8 朱立华 俞琼 王立柱
文件的打开与关闭
重点是文件的打开方式,记住下面5个符号: • r(意为read):打开一个已存在的文件以便从文件中读数据 入内存,指针fp->curp定位于文件头;若文件不存在则打开 失败返回0 • w(意为write):建立一个新文件以便写数据入文件,指针fp>curp定位于文件头;若文件已存在则清空原文件,打开失败返 回0 • a(意为append):打开一个已存在的文件以便在原文件尾追加 新的内容,指针fp->curp定位于文件尾;若文件不存在则相 当于w的作用,打开失败返回0 • +:作为前三个的后缀使用,表示打开之后既可读又可写 • b(意为binary):作为前3个的后缀使用,表示打开的是一个二 进制文件,没有此后缀则默认打开的是文本文件
2009.8 朱立华 俞琼 王立柱
4
重点难点提示
文件的操作流程 文件的操作流程 字符的读写 字符的读写
动态 演示 动态 演示 动态 演示 动态 演示
字符串的读写 格式读写
无格式读写 字符串的读写 格式读写 无格式读写
2009.8 朱立华 俞琼 王立柱
5
流与文件的概念
流:数据的流动称为流,---数据流动总是和设备或外
程序11.1的几点说明: • (1)该程序运行后,屏幕上无任何输出,读入的内容写入到 了文件D:\poem.txt中 • (2)该文本文件的显示方式有多种: • ①在VC++下直接用文件中的打开命令可以在客户区中显示 • ②回到操作系统的“资源管理器”或“我的电脑”,打开D 盘,再用鼠标左键双击打开“poem.txt”,就可以在默认的 记事本中显示文件内容 • ③进入到“命令提示符”状态键入命令:type d:\poem.txt,就可以在DOS界面下显示文件内容。 • ④通过程序11.2,打开该文件,读出文件中的内容,在显 示器显示。
2009.8 朱立华 俞琼 王立柱 12
文件的打开与关闭
因此5个符号组合起来共有12种打开方式: • (1)r、w、a: 打开文本文件,只可读或只可写(追加) • (2)r+、w+ 、a+:打开文本文件,既可读又可写(追加) • (3)rb、wb、ab:打开二进制文件,只可读或只可写(追加) • (4)rb+、wb+、ab+:打开二进制文件,既可读又可写(追加) 要保证打开文件正确才能执行后续操作,用如下代码: • FILE *fp; FILE *fp; • fp=fopen("D:\\record\\s.txt","r"); •if(!(fp=fopen("D:\\record\\s.txt","r"))) if(!fp) //如果文件指针为0则打开失败 • { printf("can't open file s.txt \n"); • exit(1); • }
冲区,并返回一个文件类型变量的地址(FILE类型的 filemame表示 mode代表文 返回值为 指针),这是打开文件
•
• •
• •
•
FILE*指针 件使用方式 磁盘文件名 打开文件通过调用fopen函数实现,原型为: FILE * fopen(char *filename,char *mode); 因此,程序首先需要定义一个FILE 以* r指针来接收 方式打开表fopen函数 带盘符路径的 的返回值,以后通过该指针对文件进行各种读写操作 示从文件中读 数据入内存 例:FILE *fp; 完整文件名 fp=fopen("D:\\record\\s.txt","r"); 如果文件打开成功,则返回一个有效地址值;如果打开失败 则返回值为NULL(0)
文件指针
以下主要讨论磁盘文件,磁盘是一种外部介质,与键
盘和显示器不同,它可以持久地保存数据。 专门存放数据的磁盘文件我们称其为数据文件 流的数据组织形式分为字符序列和字节序列,前者称 为文本流,后者称为二进制流。
• 例:double型常量136467.56789,如果是一个文本流,共
占12个字节(一个字符对应一个ASCII码,每一个ASCII码 占一个字节);如果是二进制流,共占8个字节 • 例:long int型常量100,如果是一个文本流,共占3个字节; 如果是二进制流,共占4个字节
2009.8 朱立华 俞琼 王立柱 10
//文件缓冲区"满"或"空"的程度 //文件状态标志 //文件描述符 //若无文件缓冲区,则不读取数据 //文件缓冲区大小 //文件缓冲区的位置 //指向文件缓冲区当前数据的指针 //临时文件指示器 //用于有效性检验
文件的打开与关闭
程序用到一个文件,需要系统在内存建立一个文件缓
2009.8 朱立华 俞琼 王立柱 9
文件的打开与关闭
File类型的定义:
• struct FILE • { • short level; • unsigned flags; • char fd; • unsigned char hold; • short bsize; • unsigned char *buffer; • unsigned char *curp; • unsigned istemp; • short token; • };
字符、字符串、数值型变量的输入/输出用终端方式
以及等效的文件输入输出方式对比如下:
终端输入输出 char // char int n;ch; s[10]; //整型 //字符型 字符串 ch=getchar(); gets(s); scanf(“%d”,&n); putchar(ch); 2009.8 朱立华 俞琼 王立柱 puts(s); printf(“n=%d \n”,n); 文件输入输出 char char s[10]; //字符串 int n;ch; //整型 ch=fgetc(stdin); fgets(s,5,stdin); fscanf(stdin,“%d”,&n); fputc(ch,stdout); 7 fputs(s,stdout); fprintf(stdout ,“n=%d\n”,n);
17
2009.8 朱立华 俞琼 王立柱
动 过 演示 态 程
存入串 s,串末加’\0’,正常读取返回s >curp 所指的当前位置写起,错误时返回 (2)字符串的读写:处理文本流(文本文件),文本流是 EOF (-1),否则返回一个非负数。 的位置,否则返回 NULL(0)
将字符串 s舍去串结束符‘ \0’之后从 fp从fp->curp 位置开始最多读取 n-1个字符 文件的读写 — 字符串读写
2009.8 朱立华 俞琼 王立柱 16
文件的读写—字符读写
程序11.2:从文件D:\poem.txt读出文本,在显示器上
输出。
• 几个关键性问题: • (1)打开文件时一定要判断是否正确打开,注意要保证相应的 •
•
•
• • • •
路径中一定存在该文件 函数feof的作用是判断文件是否结 (2) 正确判断一个文件是否结束有两种方式 束,结束返回1,未结束返回0 一种是根据当前读到的字符是否为EOF(-1) 如果当前读入的字符 动态演示展示的是与此 另一种是用不是文件结尾标志 feof(fp)函数判断指针 fp->curp是否已指在文 段代码等效的控制方式, 件尾 ,关键语句: while((ch=fgetc(fp))!=EOF) 注意比较 { putchar(ch); //输出该字符 }
2009.8 朱立华 俞琼 王立柱 13
文件的打开与关闭
文件打开后执行读写操作完毕, 需要释放文件缓冲区, 成功关闭文件,返回0值, 这是关闭文件,所调用的函数原型为 否则返回非0值: • int fclose(FILE *fp); 特别提醒:在执行写操作之后必须调用函数fclose,系
统将在释放输出文件缓冲区之前,将其中最后一批还未 充满该缓冲区的数据写入文件。因此,如果执行文件写 操作之后没有关闭文件,可能丢失数据. fclose执行完毕后,文件指针与文件之间不再有关联 对标准输入文件(键盘)、标准输出文件(显示器)和 标准出错输出文件(显示器),都由系统自动打开和关 闭。
与文本流和二进制流对应的磁盘文件分别称为文本文
件和二进制文件。
2009.8 朱立华 俞琼 王立柱 8
文件的打开与关闭
并不是每一次读写文件操作都需要进行磁盘访问 • 读写操作的本质:每一次对磁盘的读写都要移动磁头,以寻 找磁道扇区。若程序中的每一次读写操作都对应一次实际的 磁盘访问,则要花费很多读写时间,而且对磁盘的损耗大。 • 解决方案:系统在内存中为程序所需要的每一个文件开辟一 个“缓冲区”:当程序从磁盘文件读取数据时,一次将一批 数据送到(输入)缓冲区,然后将缓冲区的数据传给程序中 的接收变量;如果向磁盘文件输出时,先将程序中的数据送 到(输出)缓冲区,待缓冲区装满后,再一次传给磁盘文件。 • FILE类型:读取一个文件需要许多信息,例如,与该文件 对应的内存文件缓冲区的大小和地址、文件当前的读写位置、 文件缓冲区中未处理的字符个数、文件使用方式等。这些信 息存放在一个结构变量中,我们称此结构为文件类型,取名 FILE。
部介质有关 文件:与数据流动有关的设备和介质统称为文件
• 已接触到的文件:源文件、目标文件、可执行文件等
• 还有什么需要用到文件?:之前所有程序的原始数据或者从
键盘读入或者赋值;每次运行的结果未保存下来,下次想看 结果必须再次运行程序。但是,程序中的原始数据、中间结 果、最终结果有时需要以数据文件的形式保存下来并在程序 中执行相关操作 • 文件操作解决的问题:通过运行程序,能实现数据文件的读 写存储等操作,从而解决程序中的数据永久存储问题 • 文件操作的主要步骤:定义文件指针打开文件,读写,关闭
2009.8 朱立华 俞琼 王立柱 6
文件指针
每一个文件对应一个文件指针,文件操作必须通过文
件指针才能完成。
• 几个常用的文件指针:键盘--stdin,显示器--stdout,打
印机—sprn • 从键盘(stdin)和显示器(stdout)输入输出数据的操作通常 将键盘文件和显示器文件省略了
字符序列,字符串读写函数以字符串为单位读写:
• int fputs(char *s, FILE *fp); • char *fgets(char *s, int n, FILE *fp);
关于fgets函数再作几点说明:
• ①若遇回车符或文件结束符之前,已读取了n-1个字符,则读 取结束,加上串结束符‘\0’组成字符串,存入s指向的内存区 • ②若提前遇到换行符,则读取结束,在换行符后加上串结束 符‘\0’组成字符串,存入s指向的内存区。 • ③若提前遇到文件结束符,则读取结束,将文件结束符换为 串结束符‘\0’组成字符串存入s指向的内存区。 • ④若读入正常结束,则返回值是字符串指针s,否则返回空指 针值NULL。
符序列,字符读写函数以字符为单位读写:
• int fputc(int c, FILE *fp); • int fgetc(FILE *fp);
程序11.1 从键盘输入一段文本,存储到文本文件 D:\poem.txt中(fputc的应用)
15
2009.8 朱立华 俞琼 王立柱
动 过 演示 态 程
文件的读写—字符读写
高
级语 程
言
序
设
计
2009.8 朱立华 俞琼 王立柱
1
主讲人:朱立华
2009.8 朱立华 俞琼 王立柱
2
第十一章
流与文件
2009.8 朱立华 俞琼 王立柱
3
内容提要
本章介绍流与文件的有关知识 文件的几种读写方式 文件的随机访问方式 两种用程序实现文件复制的方法
2009.8 朱立华 俞琼 王立柱 14
文件的读写
根据文件读写操作涉及到的数Байду номын сангаас的类型和不同方式,分
四组介绍:
• • • •
字符的读写 字符串的读写 无格式读写 格式读写
(1)字符的读写:处理文本流(文本文件),文本流是字 结尾标志返回EOF
将字符c写入流,指针fp->curp后 ,。若成功则返回 fgetc移一个字节 从流中读取一个字符返回 , c, 否则返回 EOF(-1) 指针fp->curp 后移一个字节 ,读到
11
2009.8 朱立华 俞琼 王立柱
文件的打开与关闭
重点是文件的打开方式,记住下面5个符号: • r(意为read):打开一个已存在的文件以便从文件中读数据 入内存,指针fp->curp定位于文件头;若文件不存在则打开 失败返回0 • w(意为write):建立一个新文件以便写数据入文件,指针fp>curp定位于文件头;若文件已存在则清空原文件,打开失败返 回0 • a(意为append):打开一个已存在的文件以便在原文件尾追加 新的内容,指针fp->curp定位于文件尾;若文件不存在则相 当于w的作用,打开失败返回0 • +:作为前三个的后缀使用,表示打开之后既可读又可写 • b(意为binary):作为前3个的后缀使用,表示打开的是一个二 进制文件,没有此后缀则默认打开的是文本文件
2009.8 朱立华 俞琼 王立柱
4
重点难点提示
文件的操作流程 文件的操作流程 字符的读写 字符的读写
动态 演示 动态 演示 动态 演示 动态 演示
字符串的读写 格式读写
无格式读写 字符串的读写 格式读写 无格式读写
2009.8 朱立华 俞琼 王立柱
5
流与文件的概念
流:数据的流动称为流,---数据流动总是和设备或外
程序11.1的几点说明: • (1)该程序运行后,屏幕上无任何输出,读入的内容写入到 了文件D:\poem.txt中 • (2)该文本文件的显示方式有多种: • ①在VC++下直接用文件中的打开命令可以在客户区中显示 • ②回到操作系统的“资源管理器”或“我的电脑”,打开D 盘,再用鼠标左键双击打开“poem.txt”,就可以在默认的 记事本中显示文件内容 • ③进入到“命令提示符”状态键入命令:type d:\poem.txt,就可以在DOS界面下显示文件内容。 • ④通过程序11.2,打开该文件,读出文件中的内容,在显 示器显示。
2009.8 朱立华 俞琼 王立柱 12
文件的打开与关闭
因此5个符号组合起来共有12种打开方式: • (1)r、w、a: 打开文本文件,只可读或只可写(追加) • (2)r+、w+ 、a+:打开文本文件,既可读又可写(追加) • (3)rb、wb、ab:打开二进制文件,只可读或只可写(追加) • (4)rb+、wb+、ab+:打开二进制文件,既可读又可写(追加) 要保证打开文件正确才能执行后续操作,用如下代码: • FILE *fp; FILE *fp; • fp=fopen("D:\\record\\s.txt","r"); •if(!(fp=fopen("D:\\record\\s.txt","r"))) if(!fp) //如果文件指针为0则打开失败 • { printf("can't open file s.txt \n"); • exit(1); • }
冲区,并返回一个文件类型变量的地址(FILE类型的 filemame表示 mode代表文 返回值为 指针),这是打开文件
•
• •
• •
•
FILE*指针 件使用方式 磁盘文件名 打开文件通过调用fopen函数实现,原型为: FILE * fopen(char *filename,char *mode); 因此,程序首先需要定义一个FILE 以* r指针来接收 方式打开表fopen函数 带盘符路径的 的返回值,以后通过该指针对文件进行各种读写操作 示从文件中读 数据入内存 例:FILE *fp; 完整文件名 fp=fopen("D:\\record\\s.txt","r"); 如果文件打开成功,则返回一个有效地址值;如果打开失败 则返回值为NULL(0)
文件指针
以下主要讨论磁盘文件,磁盘是一种外部介质,与键
盘和显示器不同,它可以持久地保存数据。 专门存放数据的磁盘文件我们称其为数据文件 流的数据组织形式分为字符序列和字节序列,前者称 为文本流,后者称为二进制流。
• 例:double型常量136467.56789,如果是一个文本流,共
占12个字节(一个字符对应一个ASCII码,每一个ASCII码 占一个字节);如果是二进制流,共占8个字节 • 例:long int型常量100,如果是一个文本流,共占3个字节; 如果是二进制流,共占4个字节
2009.8 朱立华 俞琼 王立柱 10
//文件缓冲区"满"或"空"的程度 //文件状态标志 //文件描述符 //若无文件缓冲区,则不读取数据 //文件缓冲区大小 //文件缓冲区的位置 //指向文件缓冲区当前数据的指针 //临时文件指示器 //用于有效性检验
文件的打开与关闭
程序用到一个文件,需要系统在内存建立一个文件缓
2009.8 朱立华 俞琼 王立柱 9
文件的打开与关闭
File类型的定义:
• struct FILE • { • short level; • unsigned flags; • char fd; • unsigned char hold; • short bsize; • unsigned char *buffer; • unsigned char *curp; • unsigned istemp; • short token; • };
字符、字符串、数值型变量的输入/输出用终端方式
以及等效的文件输入输出方式对比如下:
终端输入输出 char // char int n;ch; s[10]; //整型 //字符型 字符串 ch=getchar(); gets(s); scanf(“%d”,&n); putchar(ch); 2009.8 朱立华 俞琼 王立柱 puts(s); printf(“n=%d \n”,n); 文件输入输出 char char s[10]; //字符串 int n;ch; //整型 ch=fgetc(stdin); fgets(s,5,stdin); fscanf(stdin,“%d”,&n); fputc(ch,stdout); 7 fputs(s,stdout); fprintf(stdout ,“n=%d\n”,n);
17
2009.8 朱立华 俞琼 王立柱
动 过 演示 态 程
存入串 s,串末加’\0’,正常读取返回s >curp 所指的当前位置写起,错误时返回 (2)字符串的读写:处理文本流(文本文件),文本流是 EOF (-1),否则返回一个非负数。 的位置,否则返回 NULL(0)
将字符串 s舍去串结束符‘ \0’之后从 fp从fp->curp 位置开始最多读取 n-1个字符 文件的读写 — 字符串读写
2009.8 朱立华 俞琼 王立柱 16
文件的读写—字符读写
程序11.2:从文件D:\poem.txt读出文本,在显示器上
输出。
• 几个关键性问题: • (1)打开文件时一定要判断是否正确打开,注意要保证相应的 •
•
•
• • • •
路径中一定存在该文件 函数feof的作用是判断文件是否结 (2) 正确判断一个文件是否结束有两种方式 束,结束返回1,未结束返回0 一种是根据当前读到的字符是否为EOF(-1) 如果当前读入的字符 动态演示展示的是与此 另一种是用不是文件结尾标志 feof(fp)函数判断指针 fp->curp是否已指在文 段代码等效的控制方式, 件尾 ,关键语句: while((ch=fgetc(fp))!=EOF) 注意比较 { putchar(ch); //输出该字符 }
2009.8 朱立华 俞琼 王立柱 13
文件的打开与关闭
文件打开后执行读写操作完毕, 需要释放文件缓冲区, 成功关闭文件,返回0值, 这是关闭文件,所调用的函数原型为 否则返回非0值: • int fclose(FILE *fp); 特别提醒:在执行写操作之后必须调用函数fclose,系
统将在释放输出文件缓冲区之前,将其中最后一批还未 充满该缓冲区的数据写入文件。因此,如果执行文件写 操作之后没有关闭文件,可能丢失数据. fclose执行完毕后,文件指针与文件之间不再有关联 对标准输入文件(键盘)、标准输出文件(显示器)和 标准出错输出文件(显示器),都由系统自动打开和关 闭。
与文本流和二进制流对应的磁盘文件分别称为文本文
件和二进制文件。
2009.8 朱立华 俞琼 王立柱 8
文件的打开与关闭
并不是每一次读写文件操作都需要进行磁盘访问 • 读写操作的本质:每一次对磁盘的读写都要移动磁头,以寻 找磁道扇区。若程序中的每一次读写操作都对应一次实际的 磁盘访问,则要花费很多读写时间,而且对磁盘的损耗大。 • 解决方案:系统在内存中为程序所需要的每一个文件开辟一 个“缓冲区”:当程序从磁盘文件读取数据时,一次将一批 数据送到(输入)缓冲区,然后将缓冲区的数据传给程序中 的接收变量;如果向磁盘文件输出时,先将程序中的数据送 到(输出)缓冲区,待缓冲区装满后,再一次传给磁盘文件。 • FILE类型:读取一个文件需要许多信息,例如,与该文件 对应的内存文件缓冲区的大小和地址、文件当前的读写位置、 文件缓冲区中未处理的字符个数、文件使用方式等。这些信 息存放在一个结构变量中,我们称此结构为文件类型,取名 FILE。
部介质有关 文件:与数据流动有关的设备和介质统称为文件
• 已接触到的文件:源文件、目标文件、可执行文件等
• 还有什么需要用到文件?:之前所有程序的原始数据或者从
键盘读入或者赋值;每次运行的结果未保存下来,下次想看 结果必须再次运行程序。但是,程序中的原始数据、中间结 果、最终结果有时需要以数据文件的形式保存下来并在程序 中执行相关操作 • 文件操作解决的问题:通过运行程序,能实现数据文件的读 写存储等操作,从而解决程序中的数据永久存储问题 • 文件操作的主要步骤:定义文件指针打开文件,读写,关闭
2009.8 朱立华 俞琼 王立柱 6
文件指针
每一个文件对应一个文件指针,文件操作必须通过文
件指针才能完成。
• 几个常用的文件指针:键盘--stdin,显示器--stdout,打
印机—sprn • 从键盘(stdin)和显示器(stdout)输入输出数据的操作通常 将键盘文件和显示器文件省略了
字符序列,字符串读写函数以字符串为单位读写:
• int fputs(char *s, FILE *fp); • char *fgets(char *s, int n, FILE *fp);
关于fgets函数再作几点说明:
• ①若遇回车符或文件结束符之前,已读取了n-1个字符,则读 取结束,加上串结束符‘\0’组成字符串,存入s指向的内存区 • ②若提前遇到换行符,则读取结束,在换行符后加上串结束 符‘\0’组成字符串,存入s指向的内存区。 • ③若提前遇到文件结束符,则读取结束,将文件结束符换为 串结束符‘\0’组成字符串存入s指向的内存区。 • ④若读入正常结束,则返回值是字符串指针s,否则返回空指 针值NULL。
符序列,字符读写函数以字符为单位读写:
• int fputc(int c, FILE *fp); • int fgetc(FILE *fp);
程序11.1 从键盘输入一段文本,存储到文本文件 D:\poem.txt中(fputc的应用)
15
2009.8 朱立华 俞琼 王立柱
动 过 演示 态 程
文件的读写—字符读写