资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,/41,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,第,13,章 文件操作,哈尔滨工业大学,计算机科学与技术学院,苏小红,第13章 文件操作哈尔滨工业大学,本章学习内容,二进制文件和文本文件,文件的打开和关闭,文件的,顺序读写与随机读写,标准输入输出及其重定向,本章学习内容 二进制文件和文本文件,Von J.Neumann Architecture,输入,/,输出,设备,存储器,运算器,控制器,程序,和输入数据,输出结果,取出数据,存入数据,操作命令,存取命令,取出,程序指令,输入,/,输出命令,计算结果,CPU,大脑,记忆装置,(,Memory,),眼睛和耳朵,(,I,/,O devices,),Where to put data in computer?,How to input or output data?,Von J.Neumann Architecture存储器,I/O,设备,输入设备,键盘、鼠标,软盘、硬盘、光驱(以文件的形式),扫描仪、视频采集卡、电视卡、游戏杆、话筒,输出设备,显示器、打印机,软盘、硬盘、,CD/DVD-RW,(以文件的形式),音箱,单纯的输入设备或者单纯的输出设备越来越少,I/O设备输入设备,标准输入,/,输出,字符界面的操作系统一般都提供标准输入与输出设备,DOS,、,Linux,、,UNIX,一般情况,标准输入就是键盘,标准输出就是终端显示器,操作系统有能力重定向标准输入与输出,比如让文件作为标准输入(标准输出),这种重定向程序本身是感觉不到的,自来水厂,标准输入/输出字符界面的操作系统一般都提供标准输入与输出设备,DOS,下的标准输入,/,输出重定向,程序,prog,如下,main(),char,c;,while,(c=getchar()!=n)putchar(+c);,输入重定向,prog outfile.txt,DOS下的标准输入/输出重定向程序prog如下,流(,Stream,),计算机中的流的概念,一般称为数据流,也叫做字节流、比特流,File stream(,文件流,),Video stream(,视频流,)and Audio stream(,音频流,)in specific field.,可以倒流的数据流,如果你想重新读已经读过的数据,或者要修改已经写入的数据,可以发出流控(,Flow Control,)命令,不会倒流的数据流也很多,网络上的数据流。网络和数据线等介质只有很小的数据缓冲区,没有大量存储的能力,流的载体?,磁盘文件、终端显示器或打印机、,存储器,等,流(Stream)计算机中的流的概念,外存,内存容易健忘,所以数据必须保存在“不健忘”的外存上,磁盘(,Magnetic Disks,),光盘(,CD,、,DVD,),U,盘(,Flash Memory,),.,容量大、断电后数据不丢失,可重复使用,,永久保存,一般都以,文件,的形式给用户及应用程序使用,外存内存容易健忘,所以数据必须保存在“不健忘”的外存上,文件(,File,),文件,一般指存储在外部介质上有名字的一组相关数据的集合,用文件可长期保存数据,实现数据共享,在,C,语言中,文件可泛指磁盘文件、终端显示器或打印机,程序中的文件,在程序运行时,由程序在磁盘上建立一个文件,通过写操作将数据存入该文件,由程序打开磁盘上的某个已有文件,并通过读操作将文件中的数据读入内存,供程序使用,文件(File)文件,文件(,Files,)与流,(,Streams,),程序通过文件打开操作把流与设备联系起来,文件打开后,可在程序和文件之间交换数据,程序通过文件关闭操作断开流与文件的联系,所有流的性质都一样,因为流与设备无关,所以能写入磁盘文件的同一函数也能写入另一设备,如控制台终端等,文件的能力则不同,如磁盘文件支持随机存取,而键盘则不能,文件(Files)与流(Streams)程序通过文件打开操,文件的存放(,Storage,),可以建立若干文件目录,(,directoryfolder,文件夹,),在目录里保存文件,同一级目录里保存的文件不能同名,对使用者而言,只要知道文件的路径,(,path,全目录,),和文件名,就能使用该文件,C:homeSunnermain.c,这都是托,OS,的福,文件的存放(Storage)可以建立若干文件目录(direc,13.1,二进制文件和文本文件,文件的类型(,Type of Files,)?,二进制文件,是一种字节序列,没有字符变换,按照数据在内存中的存储形式(二进制)存储到文件,如整数12,3,,在内存占2个字节,在文件中也占2个字节,文本文件,/ASCII,码文件,是一种字符序列,,文件中存储每个字符的,ASCII,码,如整数12,3,在文件中占3个字节,分别存放这3个字符的,ASCII,码,如果存,1234,呢?,13.1二进制文件和文本文件 文件的类型(Type of F,文件的格式(,Format of Files,),数据必须按照存入的类型读出,才能恢复其本来面貌,公开的标准格式,如,bmp,、,tif,、,gif,、,jpg,和,mp3,等类型的文件,有大量软件能生成和使用这些类型的文件,不公开或加密的文件格式,如,Microsoft Word,的,doc,格式就不公开,所以至今没有,Word,以外的其他软件能完美地读出,doc,文件,文件的格式(Format of Files)数据必须按照存入,缓冲型和非缓冲型文件系统,缓冲型文件系统,指系统自动在内存中为每一个正在使用的文件开辟一个缓冲区,在读写文件时,数据先送到缓冲区,再传给,C,程序或外存上,缓冲型文件系统利用文件指针标识文件,缓冲型文件系统中的文件操作,也称高级文件操作,高级文件操作函数,是,ANSI C,定义的文件操作函数,具有跨平台和可移植的能力,非缓冲型文件系统,不会自动设置文件缓冲区,缓冲区需由程序员自己设定,非缓冲型文件系统没有文件指针,它使用称为文件号的整数来标识文件,缓冲型和非缓冲型文件系统 缓冲型文件系统,13.2,文件的打开和关闭,下面介绍的函数均定义在,中,FILE*fopen(,const,char,*filename,const,char,*mode);,FILE*fp=fopen(C:CONFIG.SYS,rw);,filename,是文件名,包含路径。如果不含路径,表示打开当前目录下的文件,mode,是打开方式,常用为,r,、,w,、,rw,和,a,,分别表示只读、只写、读写和添加,rb,表示只读二进制文件,返回值为指向此文件的指针,留待以后使用,如果打开失败,返回值为,NULL,13.2文件的打开和关闭下面介绍的函数均定义在stdio.,文件打开方式(,mode,):,对应二进制文件,对应文本文件,“,r”,只读 必须是已存在的文件,“,w”,只写 不论该文件是否存在,都新建一个文件,“,a”,追加 向文本文件尾增加数据,该文件必须存在,“,r+”,读写 打开一个已存在的文件,用于读写,“,w+”,读写 建立一个新文件,可读可写,“,a+”,读写 向文件尾追加数据,也可读,“,rb”,“,wb”,“,ab”,“rb+”,“wb+”,“ab+”,文件打开方式(mode):对应二进制文件对应文本文件“r”,文件指针,(,File Pointer,),FILE,*fp;,是,FILE,型指针变量,标识一个特定的磁盘文件,与文件相关联的每个流都有一个,FILE,类型的控制结构,定义有关文件操作的信息,用户绝对不应修改,typedef,struct,short,level;,/*,缓冲区,满,或,空,的程度*,/,unsigned,flags;,/*,文件状态标志*,/,char,fd;,/*,文件描述符*,/,unsigned char,hold;,/*,如无缓冲区不读字符*,/,short,bsize;,/*,缓冲区的大小*,/,unsigned char,*buffer,;/*,数据缓冲区的位置*,/,unsigned char,*curp;,/*,指针当前的指向*,/,unsigned,istemp;,/*,临时文件指示器*,/,short,token;,/*,用于有效性检查*,/,FILE,;/*,在,stdio.h,文件中定义*,/,文件指针(File Pointer)FILE *fp;,13.2,文件的打开和关闭,int,fclose(FILE*fp);,把遗留在缓冲区中的数据写入文件,实施操作系统级的关闭操作,同时,释放与流联系的文件控制块,以后可以重复使用这部分空间,多数情况下,系统限制同时处于打开状态的文件总数,因此,打开文件前先关闭无用文件是必要的,fclose,函数的返回值,当顺利地执行了关闭操作,返回值为0,如果返回值为非零值,表示关闭时有错误,一般只有驱动器中无盘或盘空间不够时才失败,关闭失败会引起数据丢失、文件的破坏和程序中的随机错误,13.2文件的打开和关闭int fclose(FILE*f,13.3,按字符读写文件,字符读写,int,fgetc(FILE*fp);,从,fp,读出一个字符,,,将位置指针指向下一个字符,若读成功,则返回该字符,若读到文件尾,则返回,EOF(EOF,是一个符号常量,在,stdio.h,中定义为,-1),int,fputc(,int,c,FILE*fp);,向,fp,输出字符,c,若写入错误,则返回,EOF,,否则返回,c,13.3按字符读写文件 字符读写,13.3,按字符读写文件,【,例,13.1】,从键盘输入一串字符,转存到磁盘文件上,为什么要判断文件打开是否成功呢?,13.3按字符读写文件【例13.1】从键盘输入一串字符,转,【例13.2】,将0127之间的ASCII字符写到文件中,然后从文件中读出并显示到屏幕上,函数,feof(),检查是否到达文件尾,当文件位置指针指向文件尾时,返回非,0,值,否则返回,0,值,【例13.2】函数feof()检查是否到达文件尾,当文件,【例13.3】,修改例13.2,从文件中读出字符时,判断是否为可打印字符,若是则显示,该字符,否则显示其十进制,ASCII码值,【例13.3】,【例13.3】,修改例13.2,从文件中读出字符时,判断是否为可打印字符,若是则显示,该字符,否则显示其十进制,ASCII码值,为什么在输出第,128,个字符的,ASCII,码值后又输出了一个,-1,呢?,【例13.3】为什么在输出第128个字符的ASCII码值,【例13.3】,修改例13.2,从文件中读出字符时,判断是否为可打印字符,若是则显示,该字符,否则显示其十进制,ASCII码值,为什么在输出第,128,个字符的,ASCII,码值后又输出了一个,-1,呢?,使用函数,feof(),时,仅当读到文件结束符时才能判断出到达文件尾,而文件结束符是一个值为,-1,的不可打印的控制字符,if(!iscntrl(ch),【例13.3】为什么在输出第128个字符的ASCII码值,13.3,按字符读写文件,字符串读写,char,*fgets(,char,*s,int,n,FILE*fp);,从,fp,所指的文件中读取字符串并在字符串末尾添加,0,,然后存入,s,,最多读,n-1,个字符,当读到回车换行符、文件末尾或读满,n-1,个字符时,函数返回该字符串的首地址,特例:,fgets(buf,sizeof(buf),stdin);,int,fputs(,const,char,*s,
展开阅读全文