江南大学C语言程序设计本科第十三章PPT课件_第1页
江南大学C语言程序设计本科第十三章PPT课件_第2页
江南大学C语言程序设计本科第十三章PPT课件_第3页
江南大学C语言程序设计本科第十三章PPT课件_第4页
江南大学C语言程序设计本科第十三章PPT课件_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、1,回顾,结构体的使用 共用体的使用 枚举变量 结构体数组 结构体指针 链表的使用,2,问题,1.前面题目的结果是后面的输入时? 2.程序运行的结果需要长期保存,或有其他用途时? 3.调试程序时,输入数据量多? 引入文件,第13章 文件,掌握文件的打开和关闭 掌握并能熟练使用以下函数 fputc( ) fgtc( ) fgets( ) fputs( ) fread( ) fwrite( ) fprintf( ) fscanf( ), Focus,5,一、文件的基本概念 1、文件的一般概念 文件(file): 存储在外部介质上数据的集合。 OS 将外部设备也看作文件,终端的键盘/显示器均看作I/

2、O文件,第一节 c文件概述,2、C的文件系统 缓冲文件系统:系统自动为每个正在使用的文件系统在内存中开辟一个缓冲区。程序与文件之间的I/O 经由缓冲区。ANSI C标准采用缓冲文件系统。 非缓冲文件系统: 系统不自动开辟缓冲区,由程序为每个文件设定缓冲区。 由于C与UNIX 关系密切,UNIX I/O 系统使用非缓冲文件系统,因而多数C也兼容之。,7,C的I/O系统在程序员和设备间提供了一级抽象。这个抽象被称为流(stream),而实际设备则称为文件(files) 。 文件由缓冲文件系统变换成抽象的逻辑设备流。 C文件是字符(文本)流或二进制流,无其它高级语言所具有的记录界限,存取以字节为单位

3、。I/O的开始和结束仅受程序控制而不受流中符号的控制 。 共有两类流:文本流(text)和二进制流(binary)。,二、文件流与文件,文本流 文本流(text stream)是一种字符序列。以ASCII 码存放,每字符占一个字节。数值需要逐位转换,32767存为51、50、55、54、55 计五个字节。n变为一个回车/换行符号对(CR/LF carraige return/line feed )ASCII 码13、10。文件末有一字符 z , ASCII 码为 26。 二进制流 二进制流(binary stream)是一种字节序列,数值以二进制数表示。32767存为7FFFH,int 型时占

4、两个字节。不需转换、节省存储空间,从而方便存取、提高速度。,标准流 ANSI C 有三个预定义的标准流:stdin、stdout 、stderr ,也称为标准/文件。它们都对应终端。程序运行时系统自动将它们打开,运行结束自动关闭。例如:使用scanf( )、gets( )等函数时使用stdin 流,对应标准输入-键盘; 使用printf( )、puts( ) 时,使用stdout 流,对应标准输出-显示器。stderr 流也对应标准输出-显示器。,10,三、 文件的基本操作步骤,打开文件,读写(创建)文件,关闭文件,11,在“stdio.h” 中(QC) struct _iobuf char

5、_FAR_ *_ptr; int _cnt; char _FAR_ *_base; char _flag; char _file; ; typedef struct _iobuf file ;,例如:file *fp1, *fp2;,typedef struct int _fd ; /* 文件号 */ int _cleft ; /* 缓冲区剩下的字符 */ int _mode ; /* 文件操作模式 */ char *_nextc ; /* 下一个字符指针 */ char *_buff ; /*文件缓冲区指针 */ file;,四、 指向文件的指针变量,12,1. 打开文件 file *fp

6、; fp=fopen( filename, mode); filename为文件名(路径名)。mode对文件的访问方式 一般方法如下: file *fp; if (fp=fopen(“c:docexam.txt”,“w”) = = NULL) puts(“cannot open the filen”); exit(1); ,第二节 文件的打开与关闭,mode 意 义 “r” 读文本文件 “w” 写或创建文本文件 “a” 向文本文件追加 “rb” 读二进制文件 “wb” 写或创建二进制文件 “ab” 向二进制文件追加,mode 意 义 “r+” 读写文本文件 “w+” 读写(创建)文本文件 “a

7、+” 向文本文件追加 “rb+” “读打开”二进制文件 “wb+” 读写(创建)二进制文件 “ab+” 向二进制文件读写(追加),2. 关闭文件 fclose(filepointer);或: if(fclose(filepointer) printf(“close error”);exit(2); 使用FILE类型和fopen( )、fclose( )函数应包含stdio.h,15,1. 输入输出字符 1)I/O字符 ch=fgetc(fp); fputc(ch,fp);,第三节 读写文件,putchar(ch)实际上是用fputc(ch, fp)定义的一个宏: #define putchar

8、(ch) fputc(ch, stdout) 默认输出到显示器即标准输出文件stdout,2)判断文件尾 fgetc( )在读到文件末尾时,返回文件结束标志EOF (在stdio.h中定义为 1)。此标志只适合于文本文件,因为二进制文件中的数值-1会与其相混,造成提前结束。常用feof( )函数测试文件尾。若是文件结束返回值1。它既可以用于二进制文件也可以用于文本文件。 feof(文件指针 ) 返回值为1表示文件结束,例:假设软盘a的根目录下有一个ASCII码文件“abcdat”,其内容为“I am a student”。编程完成: (1)显示文件“abc.dat”的内容。 (2)把字符串“Y

9、ou are a worker”写入文件“abc.dat。 (3)再次显示文件“abc.dat”的内容。 分析:显示指定的文本文件内容,再写入新内容,必须打开文件并指定文件的使用方式为”r+”,表示对同一个文本文件先读后写。写入的新内容覆盖原有的旧内容。 程序清单如下:,#include main() FILE *fp; char *str”You are a worker”;int k; if(fp=fopen(“a:abc.dat”,“r+”)NULL) * fp为NULL,表示文件打开失败*/ printf(“文件不存在n”);exit(O); while(!feof(fp) *当文件没

10、有结束时,feof(fp)为假,!feof(fp)为真* putchar(fgetc(fp);*显示文件“abcdat”的原有内容* printf(“n”);,rewind(fp); *把文件的位置指针移到文件的开始处* for(k0; strk!0;k+) fputc(strk,fp); *写入新内容* rewind(fp);*把文件的位置指针移到文件的开始处* while(!feof(fp) *当文件没有结束时,feof(fp)为假,!feof(fp)为真* putchar(fgetc(fp);*显示文件“abcdar”的新内容* fclose(fp); printf(“n”); 运行结果

11、:I am a student You are a worker,Y,You,You are a workerz,Yo,2. 输入输出数据块 一次可I/O一个数组或结构体类型的数据 ANSI C 设置了两个函数: fread(buffer, size, count, fp) fwrite(buffer, size, count, fp) buffer:是一个指针。对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址(以上指的是起始地址)。 size:要读写的字节数。 count:要进行读写多少个size字节的数据项。 fp:文件型指针。,例: 文件sru_list中

12、有4个学生的有关数据,将它们读出在屏幕上显示出来,然后把它们重新存到磁盘文件上去。,# include “stdio. h” # define SIZE 4 struct student_type char namel0 ; int num ; int age ; char addr l5 ; stud SIZE ;,main ( ) FILE *fP; int i; if (fp=fopen(stu_list, ”rb+) = =NULL) printf ( cannot open filexn ); return; for (i = 0 ;iSIZE ;i+ +) fread(,3. 格式

13、化I/O fprintf(fp, 格式字符串,输出表列 ) fscanf(fp,格式字符串,输入表列 ) 除fp外,其余同printf( ),scanf( ),4. 串输入输出 fgets(str1, n, fp) 从fp指定的文件中读出n-1个字符到str1,并在最后添加一个0.或遇换行符、EOF符停止。 fputs( str2, fp) 把str2的内容输出到fp指定的文件中, str2可以是字符串常量、字符数组、字符型指针。 注:使用方法与getsputs类似,例: 从键盘输入数据“97101,李明,男,20 ”和“97102,王小丽,女,18 存放在文件txtl.dat”中。再将文件t

14、xtl.dat”的数据读出并显示。,#include struct std long xh; char name7; char sex3; int nl; ; main( ) FILE *fp; struct std a; int i; if (fp=fopen(“txt1.dat”,“w+”)=NULL) * fp为NULL,表示文件打开失败*/ printf(“磁盘空间不够n”); exit(0); for (i=0;i2;i+), scanf (“ldsd”, ,(1). 返回文件开头 rewind(fp) (2). 随机定位 fseek(fp, 偏移量,基点) 基点 名字 数字表示 文

15、件开始 SEEK_SET 0 文件当前位置 SEEK_CUR 1 文件末尾 SEEK_END 2 偏移量可以 +/-,28,课堂例题,课后练习,上机作业,fscanf函数的正确调用形式是 _ A. fscanf(文件指针,格式字符串,输出表列); B. fscanf(格式字符串,文件指针,输出表列); C. fscanf(格式字符串,输出表列,文件指针); D. fscanf(文件指针,格式字符串,输入表列);,D,C语言标准库函数fgets(string,n,fp)的功能是_。 A. 从文件fp中读取长度为n的字符串存入指针string指向的内存 B. 从文件fp中读取长度为n-1的字符串存

16、入指针string指向的内存 C. 从文件fp中读取n个字符串存入指针string指向的内存 D. 从文件fp中读取长度不超过长度为n的字符串存入指针string指向的内存,B,输出结果为_ #include FILE *fp ; main( ) int s=0 , i, a4=15,25,33,58 , b ; if ( (fp=fopen(data.txt,w) ) = NULL) printf(“errorn”); exit(0); for (i=0; i4; i+) fprintf ( fp, “%d,”, ai ) ; fclose (fp) ; if( (fp=fopen(data

17、.txt,r) ) = NULL ) printf(“cannot open this filen”); exit(0); for (i=1; i4; i+) fscanf ( fp, “%d,”, ,结果为 73,32,上机作业,1.阅读下面的程序,指出它的功能,并上机调试验证。 #include stdio.h void main() FILE *fp; char ch; if(fp=fopen(file2.txt,w)=NULL) printf(cant open this file); exit(-1); while(ch=getchar()!=n) fputc(ch,fp); fclose(fp); ,33,2.从键盘上输入任意10个数,把10个数按由小到大的顺序排列,然后把这组数输出到文件out.txt中,再把这组数中相同的数据删得只剩一个,然后以每行4个数的格式追加到文件out.txt中去。例如输入9,8,6,10,4,8,9,7,5,4,则文件out.txt中的内容为:

温馨提示

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

评论

0/150

提交评论