您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > Fortran-95-程序设计-第六章—新
八、文件中山大学环境与科学工程学院陆希♦物理设备与逻辑设备♦文件的概念♦外部文件分类♦文件基本操作(OPEN,WRITE/READ...)♦文件记录的存取•程序离不开数据,有效组织数据输入是设计和编写程序的基本要求。•从键盘输入数据和向屏幕输出数据,适用于数据量比较小的情况,不能与其它软件或程序交换数据信息。•从文件输入、向文件输出数据,适用于数据量比较大的情况,便于同其它软件或程序交换数据信息。♦物理设备与逻辑设备•物理设备:计算机外部硬件设备,如:磁盘、磁带、键盘、显示器等。文件中数据被存储在某个外部设备上。•逻辑设备:在程序中使用的设备描述符号。•物理设备与逻辑设备之关系:一个物理设备可定义多个逻辑设备,一个逻辑设备可与多个不同物理设备连接。•外部文件:在物理设备上建立的文件。设备描述符为一个整数,称为设备号,通过OPEN语句指定。*、0、5、6为标准设备号。•内部文件:在内存上建立的文件。设备描述符为字符型变量名、字符型数组名、字符数组元素名、子串名。内部文件名,逻辑设备名CHARACTER*40str1,str2str1='125,250,375'READ(str1,*)i,j,kWRITE(str2,100)i,j,k,i+j+k……内部文件名,逻辑设备名str1='125,250,375'str2='i=125j=250k=375i+j+k=750'物理设备:内存储器······PARAMETER(max=100)REAL::score(max),N,sum=0.0,aveOPEN(1,FILE='exam2.in')OPEN(2,FILE='exam2.out')READ(1,*)NREAD(1,*)(score(I),I=1,N)WRITE(2,*)'学生成绩有:'WRITE(2,100)(score(I),I=1,N)WRITE(2,200)avePRINT*,’程序运行正常结束。’END外部文件名,逻辑设备号外部文件名,逻辑设备号物理设备:磁盘外部输入文件:'exam2.in'578.5,55.0,85.5,90.0,68.5外部输出文件:'exam2.out'学生成绩有:78.5,55.0,85.5,90.0,68.5平均分数:75.5·········♦文件的概念•文件:存放在某种存储设备上的一组数据集合,由文件名唯一标识。在FORTRAN的I/O系统中,数据以文件的形式进行存储和交换,操作系统以文件为单位对数据进行管理。•文件由若干记录组成。没有记录的文件为空文件。•文件操作(读、写)以记录为单位。从文件中一次输入一个记录,向文件中一次输出一个记录。•通过READ和WRITE语句从文件中输出、输入数据。•文件分内部文件和外部文件两种文件。内部文件:存放在内存储器上的文件。内部文件特点:保存小批量数据,不能长期保存。内部文件作用:一般用于少量二进制数据与字符型数据相互转换,以及字符串和合并或截取。如:外部文件:连接在计算机主机上的一类设备(如:键盘、显示器、打印机等)或存放在外部存储器上的文件。外部文件特点:能长期保存大批量数据。在程序中使用外部文件,必须先用OPEN语句为外部文件指定设备号,建立外部文件与设备号之间的联系。如:在Fortran中有4个预定义的外部文件(设备):设备号连接的设备星号(*)总是键盘和显示器0缺省状态下是键盘和显示器5缺省状态下是键盘6缺省状态下是显示器外部文件分类:Fortran支持两种文件的存取方式(访问方式):1、顺序存取,从文件的开头一步步向下存取程序中要读写第N条记录时,必须至少已对前面的N-1记录进行过读操作ACCESS=‘SEQUENTIAL’2、直接存取,可以任意跳到文件的任何一个位置来读写文件中的记录从1开始连续编号,记录的长度是通过OPEN语句中的RECL选项来描述的。直接文件中的记录是通过指定要访问的记录号来实现的ACCESS=’DIRECT’两种文件的结构(存储格式):1、文本文件字符符号保存,直观;读取时需要转换,占存储空间大格式化文件,记录数据内容的记录是以ASCII字符的方式存在的,每一条记录是以ASCII码中的回车符CR(0D)加换行符LF(0A)来结束的,可以用文本编辑软件打开格式文件并直接看懂其内容。即存放在文件中的数字就是平时所看到的数字字符,字符串也就是平时所看到的字符串。FORM=‘FORMATTED’2、二进制文件以二进制代码保存;读取速度快,节省空间无格式文件由一系列物理块组成的记录组成,所存储的记录序列的存放方式与其在内存中的存放非常相似,在输入输出时几乎不需作转化。由于去掉了格式控制,与有格式文件相比,在使用数据信息时所做的处理更简洁更迅速;同样的原因使得无格式文件中即使存放着数字,也不能用文本编辑软件打开并看到它们。FORM=’UNFORMATTED’3、FORM=’BINARY’?二进制文件,是处理最快、最简洁的一种文件,也是最紧凑的存储格式,适合于大批量数据的存储。在程序中可以用带有选项的OPEN语句来打开或建立二进制文件♦文件的基本操作OPEN语句——文件的打开例:open(10,file=‘d:\data\2006\feb\uwnd.dat’,&form=‘unformatted’,status=‘unknown’,&access=‘direct’,recl=144*73*4,&err=100,iostat=iovar,position=‘asis’)WRITE/READ语句——文件的输入输出programtest2CLOSE语句——文件的关闭文件读写操作结束后,可通过CLOSE语句将文件关闭。取消逻辑设备符(文件编号)与磁盘上的外部文件之间的关系。CLOSE语句可缺省。CLOSE([Unit=]设备号[,ERR=错误转移][,IOSTAT=IO状态][,STATUS=文件属性])♦文件记录的存取有格式顺序存取一个格式化文件是一个由按顺序写到文件中的有格式记录序列组成的,当要对文件进行读操作时,读取的顺序就是记录在文件中的存放顺序。文件中记录的长度不一定相同,记录也可以是空的。例:从预先准备好的数据文件中输入数据,并输出数据写到文件中已有数据文件:F1.dat写出到数据文件:F2.dat程序ex801例:把1到10以及它们的平方数、立方数以表格形式存放到TAB.DAT文件中。程序把输出的数据重新读出并显示在终端屏幕上以检验文件的内容程序ex802等同于:close(2)open(2,……)1.EX0909.F902.implicitnone3.integer,parameter::inputfileid=10,outputfileid=114.integer,parameter::maxbuffer=2005.character(len=80)::inputfile,outfpufile6.character(len=maxbuffer)buffer7.integercount8.integererror9.logicalalive10.write(*,*)“InputFilename”11.read(*,“(A80)”)inputfile12.write(*,*)“OutputFilename”13.read(*,“(A80)”)outputfile14.inquire(file=inputfile,exist=alive)15.if(.not.alive)then16.write(*,*)trim(inputfile),“doesn’texsit”17.stop18.endif19.open(unit=inputfileid,file=inputfile,status=“old”)20.open(unit=outpufileid,file=outputfile.Status=‘replace’)21.count=122.dowhile(.true.)23.!读入一整行的数据24.read(inputfileid,“(A200)”,iostat=error)buffer)25.if(error/=0)exit!没有数据了,离开循环26.!在最前面加上行号27.write(outputfiled,“(I3,‘.’,A)”)count,trim(buffer)28.count=count+1!计算行数29.enddo30.close(inputfiled)31.close(outputfiled)32.stop33.endprogram练习1、从键盘输入20个数,以文本方式写入文件data1.txt,2、输入十个学生的学号和一门课的成绩,存入顺序文件中。有格式直接存取在格式化直接文件中,所有记录的长度都相同并且可以以任意顺序读写。记录的长度由OPEN语句中的RECL=选项指定,该长度应该大于或等于最长的记录中的字节数。CR和LF是分隔符,不包括在RECL中。注意:直接访问的文件,即,ACCESS=‘DIRECT’时,FORM的默认值是’UNFORMATTED’,所以,如果是打开直接读取的文本文件,则一定要设置FORM=’FORMATTED’一旦某个直接访问记录被写入就不能再删除它,但可以覆盖这个记录。在输出到一个格式化直接文件时如果数据没有占满一个记录,则编译系统将在剩下的位置上补以空格,保证文件只包含长度相同的完整的记录。从文件中读数据时,当I/O列表或格式描述符中要读取的数据多于记录中的数据时,编译器也会以空格填充未读数据的变量。可以通过在打开文件的OPEN语句中设置PAD=NO来避免填补空格,此时输入记录必须有和输入列表和格式描述符所要求的一样多的数据,否则会产生错误。PAD=NO对输出没有影响。例:有格式文件每一条记录是以ASCII码中的回车符CR(0D)加换行符LF(0A)来结束的例:把1到10和它们的平方根存放到一个直接存取文件中,然后随意查找1到10的平方根数。程序ex603例:设计一个输入选手打击率的程序,这个程序能自由让用户决定现在要输入哪一位打击者的打机率。无格式文件的存取(二进制文件之一)数据处理过程中,输出的大量数据往往并不是给人阅读的,而是作为中间数据为下一次输入作准备,由计算机去读它,用无格式输入输出可以避免格式输入输出中的多余步骤。以计算机内部的二进制代码形式存放,只能存放于磁带或磁盘中,不能在屏幕上显示,也不能输出到打印机打印。无格式顺序文件无格式顺序文件中记录的长度可以不同,文件以130或少于130字节为一个物理块进行组织。每个物理块包含着输入到文件中的数据(最多128字节),编译系统在物理块之间加入两个1字节长的长度值以说明每个记录的起始和结束位置。一个逻辑记录包含一个或多个物理块,其大小可在程序中指定,编译系统会相应地使用需要数量的物理块。当创建一个包含多个物理块的逻辑记录时,编译系统把长度值置为129以表示当前物理块的数据和下一个物理块相连接。例如,如果写入了140字节的数据,则逻辑记录的结构如图所示无格式顺序文件中的第一个和最后一个字节是保留字节:第一个字节的值为75,最后一个字节的值为130。Fortran使用这些字节作为错误检测和文件结束的判断。例:无格式直接文件无格式直接文件是一系列非格式的记录,可以以任意顺序读写记录。记录的长度都相同,由OPEN语句中的RECL=选项指定。没有字节分隔符或其它表示记录结构的字节例:14510112021242530*二进制顺序文件二进制顺序文件是一系列按同一顺序和同样二进制数个数来读写的值。其中没有记录边界,没有说明文件结构的特殊字节。数据读写时长度和形式都不改变。数据记录的长度可以不等。对于任何输入输出数据,内存中的字节序列就是文件中的字节序列。二进制顺序文件是处理最简洁、速度最快的文件。1613*二进制直接文件二进制直接文件存储一系列二进制数记录,可以按任何顺序访问。与二进制顺序文件不同的是,这些记录的长度是相等的,由OPEN语句中的RECL=指定。在二进制直接文件中可以写入部分记录,记录中末使用
本文标题:Fortran-95-程序设计-第六章—新
链接地址:https://www.777doc.com/doc-4877014 .html