第七讲文件及使用7.1文件的概念文件:存放在某种存储设备上的一组数据集合,由文件名唯一标识。文件由若干记录组成。没有记录的文件为空文件。文件操作(读、写)以记录为单位。从文件中一次输入一个记录,向文件中一次输出一个记录。通过READ和WRITE语句从文件中输入输出数据。文件分外部文件和内部文件两种文件。外部文件:连接在计算机主机上的一类设备(如:键盘、显示器、打印机等)或存放在外部存储器上的文件。外部文件通过一个符合windows命名规则的文件名进行标识。外部文件特点:能长期保存大批量数据。在程序中使用外部文件,必须先用OPEN语句为外部文件指定设备号,建立外部文件与设备号之间的联系。如:OPEN(1,FILE='exam2.in')OPEN(2,FILE='exam2.out')READ(1,*)(score(I),I=1,N)WRITE(2,*)‘学生成绩有:’内部文件:存放在内存储器上的文件。通过一个字符变量进行标识。内部文件特点:保存小批量数据,不能长期保存。内部文件作用:一般用于少量二进制数据与字符型数据相互转换,以及字符串和合并或截取。如:PROGRAMexam4CHARACTER*40str1,str2str1='125,250,375'READ(str1,*)i,j,kWRITE(str2,100)i,j,k,i+j+k100FORMAT('i=',I3,'j=',I3,'k=',I3,'i+j+k=',I3)write(*,*)i,j,kwrite(*,*)str2END外部文件也称磁盘数据文件,简称文件。有三种存储格式和两种存取方式。根据不同存储格式和存取方式分类,有六种文件类型。有格式顺序存取文件。有格式直接存取文件。无格式顺序存取文件。无格式直接存取文件。二进制直接存取文件。二进制顺序存取文件。7.2外部文件分类存储格式是指文件中数据的存储规则和组织结构。有三种存储格式:有格式、无格式和二进制。有格式存储格式:文件中数据以字符形式(ASCII码)存放,以回车符(CR)和换行符(LF)作为字符行的结束标志。在OPEN语句中用FORM选项指定‘FORMATTED‘,可缺省。OPEN(UNIT=1,FILE='exam2.in',FORM='FORMATTED')OPEN(UNIT=2,FILE='exam2.out')无格式存储格式:文件中数据以二进制形式存放。在OPEN语句中用FORM选项指定‘UNFORMATTED‘。OPEN(UNIT=1,FILE='exam2.in',FORM=‘UNFORMATTED')OPEN(UNIT=2,FILE='exam2.out',FORM=‘UNFORMATTED')二进制存储格式:文件中数据以真正的二进制编码形式(在内存的存储形式)存放。在OPEN语句中用FORM选项指定‘BINARY‘。OPEN(UNIT=1,FILE='exam2.in',FORM=‘BINARY')OPEN(UNIT=2,FILE='exam2.out',FORM=‘BINARY')存取方式是指对文件中数据读写方式,也称文件访问方式。有两种存取方式:顺序存取和直接存取。内部文件只有顺序存取,外部文件可顺序存取,也可直接存取。顺序存取文件记录长度可不同,直接存取文件记录长度相同。顺序存取方式:在进行存取操作时只能从第1个记录开始按存储顺序依次进行,即在程序中要读写第N个数据时,必须先读写前面的N-1个数据,读写时可使用REWIND或BACKSPACE语句改变文件指针位置(读写位置)。在OPEN语句中用ACCESS选项指定‘SEQUENTIAL‘,对有格式文件可缺省。OPEN(UNIT=1,FILE='exam2.in',ACCESS=‘SEQUENTIAL')OPEN(UNIT=2,FILE='exam2.out')直接存取方式:在进行存取操作时可以读写任意一个记录(数据),也称随机存取方式。OPEN(UNIT=1,FILE='exam2.in',ACCESS=‘DIRECT‘,RECL=40)OPEN(UNIT=2,FILE='exam2.out',ACCESS=‘DIRECT‘,RECL=40)每一个文件都有一个隐含的指针,称为文件指针,文件指针指向文件中的一个记录,来控制文件的当前读写位置。文件打开后,文件指针指向第一个记录。文件指针指向的记录称为当前记录。文件指针指向第一个记录位置,称为文件的起始位置,文件指针指向最后一个记录位置,称为文件的结束位置。对于顺序文件,在读写前,要对文件指针进行定位,对于直接文件,在读写过程中,要对文件指针进行定位。在文件数据的读写过程中,只对文件指针指向的当前记录进行读写(存取)。数据文件文件指针记录1记录2···记录i···记录n7.3文件的基本操作在读写文件数据前,需通过OPEN语句将文件打开。建立逻辑设备符(文件编号)与磁盘上的外部文件之间的关系。一般格式:OPEN([UNIT=]设备号,FILE=文件名[,ACCESS=存取方式][,FORM=存储格式][,RECL=记录长度][,ERR=错误转移][,BLOCKSIZE=缓冲区大小][,CARRIAGECONTROL=首字符含义][,DELIM=分界符][,BLANK=空格含义][,ACTION=读写方式][,IOFOCUS=子窗口][,IOSTAT=IO状态][,PAD=补加空格][,POSITION=读取位置][,SHARE=共享][,STATUS=文件属性])文件读写操作结束后,可通过CLOSE语句将文件关闭。取消逻辑设备符(文件编号)与磁盘上的外部文件之间的关系。CLOSE语句可缺省。一般格式:CLOSE([Unit=]设备号[,ERR=错误转移][,IOSTAT=IO状态][,STATUS=文件属性])文件在操作过程中,可强制在文件内当前记录位置后置文件结束标志。使用ENDFILE语句可强制设置文件结束标志,文件结束标志后的记录被清除。一般格式:ENDFILE{设备号∣([UNIT=]设备号[,ERR=错误转移][,IOSTAT=IO状态])}文件打开后,从文件输入数据。使用READ语句完成数据输入。一般格式:READ{{格式说明,∣名字列表}∣([UNIT=]设备号[,{[FMT=]格式说明∣[NML=]名字列表}][,ADVANCE=高级输入][,END=结束转移][,EOR=记录转移][,ERR=错误转移][,IOSTAT=IO状态][,REC=记录号][,SIZE=输入尺寸])}输入数据列表文件打开后,向文件输出数据。使用WRITE语句完成数据输出。一般格式:WRITE([UNIT=]设备号[,{[FMT=]格式说明∣[NML=]名字列表}][,ADVANCE=高级输入][,ERR=错误转移][,IOSTAT=IO状态][,REC=记录号])输出数据列表文件打开后,在文件的存取操作过程中有时要查询文件的有关状态和属性,以便决定某种操作。使用INQUIRE语句完成属性查询。一般格式:INQUIRE({[UNIT=]unit∣FILE=file∣IOLENGTH=iolength}[,ACCESS=access][,SEQUENTIAL=sequential][,DIRECT=direct][,FORM=form][,FORMATTED=formatted][,UNFORMATTED=unformatted][,BINARY=binary][,ACTION=action][,MODE=mode][,READ=read][,WRITE=write][,READWRITE=readwrite][,BLANK=blank][,BLOCKSIZE=blocksize][,CARRIAGECONTROL=carriagecontrol][,DELIM=delim][,ERR=err][,EXIST=exist][,IOFOCUS=iofocus][,IOSTAT=iostat][,NAME=name][,NAMED=named][,RECL=recl][,NEXTREC=nextrec][,RECORDTYPE=recordtype][,NUMBER=number][,PAD=pad][,POSITION=position][,SHARE=share][,OPENED=opened])文件打开后,在读写操作中有时要将当前文件指针位置指向文件起始位置(称为反绕,类似倒带操作),以便从起始位置进行读写操作。使用REWIND语句完成文件指针反绕操作。一般格式:REWIND{设备号∣([Unit=]设备号∣ERR=错误转移∣IOSTAT=出错状态)}文件打开后,在文件的存取操作过程中有时要将当前文件指针位置向后回退一个记录位置。使用BACKSPACE语句完成文件指针回退操作。一般格式:BACKSPACE{设备号∣([Unit=]设备号∣ERR=错误转移∣IOSTAT=出错状态)}外部设备:键盘、显示器、终端、打印机、串行口、并行口等设备。象使用外部文件一样使用这些外部设备。每一个外部设备都有一个设备名,类似于文件名。如表10-1所示。下面给出一些使用外部设备的OPEN语句:!连接一台打印机,程序中可从打印机输出数据,设备号为1OPEN(UNIT=1,FILE=‘PRN’)!连接一个串行口,程序中可从串行口输出数据,设备号为2OPEN(UNIT=2,FILE=‘COM1’)!连接一个并行口,程序中可从并行口输出数据,设备号为3OPEN(UNIT=3,FILE='LPT1')设备名外部设备或部件CONConsole(终端、控制台、标准输出设备)PRNPrinter(打印机)COM1SerialPort#1(串行口1)COM2SerialPort#2(串行口2)LPT1ParallelPort#1(并行口1)LPT2ParallelPort#1(并行口2)NULNULL(NULL设备,忽略输入输出操作)AUXSerialPort#1(串行口1)LINE1SerialPort#1(串行口1)USER1StandardOutput(标准输出)ERR1Standarderror(标准错误信息)有格式顺序文件:具有“FORMATTED”和“SEQUENTIAL”属性的文件。有格式顺序文件可用任何文本编辑器或OPEN、WRITE语句创建。属于可视化文件。有格式顺序文件是由若干文本行组成,每个文本行是一个记录,记录由回车符(CR)和换行符(LF)结束,回车符CR(ODH)和换行符LF(OAH)是记录的结束标志。每个记录长度(字节数,每个字符占一个字节)可以不同,默认最大记录长度为132个字节,可通过RECL选项指定最大记录长度。有格式顺序文件读写操作与键盘、显示器的读写操作类似,不同的是需要用OPEN语句打开文件,指定设备号,在READ和WRITE语句中指定设备号,而不是星号“*”。PROGRAMchaper1271INTEGER::A(10),sum=0,ave!打开一数据文件,先用文本编辑器创建,默认是一个有格式顺序存取文件!数据文件中有10个整数,第1行5个,第2行2个,第3行3个!数据文件有3个记录行,每个记录行长度不同OPEN(11,FILE='input1.dat')READ(11,*)(A(I),I=1,10)!按表控格式从数据文件中输入10个数!READ(11,*)A(1),A(2),A(3),A(4),A(5)!可用3个READ语句分3个行输入!READ(11,*)A(6),A(7)!READ(11,*)A(8),A(9),A(10)CLOSE(11)