收藏 分享(赏)

第十一章 文件1.ppt

上传人:hyngb9260 文档编号:7734278 上传时间:2019-05-24 格式:PPT 页数:56 大小:155.50KB
下载 相关 举报
第十一章 文件1.ppt_第1页
第1页 / 共56页
第十一章 文件1.ppt_第2页
第2页 / 共56页
第十一章 文件1.ppt_第3页
第3页 / 共56页
第十一章 文件1.ppt_第4页
第4页 / 共56页
第十一章 文件1.ppt_第5页
第5页 / 共56页
点击查看更多>>
资源描述

1、第十一章 文件,文件的概念 文件的打开与关闭 文件的读写 其他文件操作,11.1 文件的概念,11.1.1 文件与记录 所有的数据来源和数据发送目标都被认为是文件。文件有外部文件和内部文件之分。 记录是作为逻辑单位顺序排列的一组相关数据项(又称字段)的集合,是构成文件的基本单位。 文件系统是负责存取和管理文件的公共信息管理机构 。,11.1.2 文件的存取方式,FORTRAN数据文件的存取方式分为两种:顺序存取和直接存取。 顺序存取是指将文件的记录按建立的时间先后顺序依次存放在存储介质中。 直接存取,又称随机存取。它是指将文件记录由程序指定的某一位置直接存取。 顺序存取的文件中所有的记录长度可

2、以完全不同,而直接存取的文件中的记录的长度由OPEN语句中的说明项“RECL=”指定,每个记录长度相同。,例11.1 分别以顺序方式和直接方式将字符型、数值型数据写入文件中。,OPEN(10,FILE=“A.TXT“,FORM=“FORMATTED“,& ACCESS=“SEQUENTIAL“) WRITE(10,100)911 WRITE(10,200) “WELCOME“ OPEN(11,FILE=“B.TXT“,FORM=“FORMATTED“ , & ACCESS=“DIRECT“,RECL=10) WRITE(11,100,REC=1)911 WRITE(11,200,REC=2)

3、“WELCOME“ 100 FORMAT(1X,I5) 200 FORMAT(1X,A15) END,11.1.3 文件的结构,文件的结构是指组成文件的记录格式,文件的结构方式决定了记录的存储形式,影响文件的具体操作方式。数据在文件中可以用三种结构形式存放,即有格式文件、无格式文件、二进制文件。 有格式文件中的记录为字符形式(或称ASCII码形式),文件的数据流由一个个的字符组成,每个字符占一个字节。 无格式文件是由物理数据块所构成的记录序列,由无格式记录组成,其记录是数值序列。无格式的直接文件仅包含数据本身。 二进制文件是Microsoft的一种扩充模式,数据按其在内存中的存储形式存储在文件

4、中,其数据流由二进制代码形式的一个个字节组成,结构最紧凑,适合于保存大容量的数据。,例11.2 将整数2000000000和一个字符串“DIR”分别存于三种结构的文件中。,OPEN(10,FILE=“A.TXT“,FORM=“FORMATTED“,& ACCESS=“SEQUENTIAL“) WRITE(10,(I10)2000000000 WRITE(10,(A3) “DIR“ OPEN(11,FILE=“B.TXT“,FORM=“UNFORMATTED“,& ACCESS=“SEQUENTIAL“) WRITE(11) 2000000000 WRITE(11) “DIR“ OPEN(12,

5、FILE=“C.TXT“,FORM=“BINARY“,& ACCESS=“SEQUENTIAL“) WRITE(12) 2000000000 WRITE(12) “DIR“ END,内部文件与外部文件,外部文件可以用格式的、无格式的或二进制的方式打开,而所有的内部文件都是格式化文件。一个内部文件就是一个字符变量或字符数组元素,它正好是一个记录,且具有相同的记录长度。如果写入的记录比字符变量或字符数组元素的记录长度短,则余下的位置用空格填满。内部文件只允许有格式的顺序存取。,11.1.4 文件的定位,文件在存取的过程中,有一个文件指针控制着读写的位置,它总是指向当前进行输入输出的那个记录。文件的

6、位置指文件内部数据具体的位置,主要有起始位置、结束位置、当前位置、当前记录、前一记录和后一记录。一般来说,对一个顺序文件在进行写操作后要进行读操作,必须先用文件定位语句重新设置文件指针位置。,11.2 文件的打开与关闭,11.2.1 OPEN语句 OPEN语句把一个设备单元号和一个文件或物理设备相联系。一旦建立了联系,程序中将由该设备单元号来代表相应的文件。例如: OPEN (UNIT = 10, FILE = “undamp.dat“,& ACCESS=“DIRECT“) WRITE (10, “ (A18,) “) “ Undamped Motion: “,OPEN语句格式,OPEN (U

7、NIT= unit , FILE=file , STATUS=status , ACCESS=access , FORM=form , RECL=recl , ERR=err , IOSTAT=iostat , SHARE=share , ACTION=action , BLANK=blanks , BLOCKSIZE=blocksize , IOFOCUS=iofocus ,ARRIAGECONTROL=carriage,DELIM=delim , POSITION=position , PAD=pad ),常用说明项包括:,(1)单元号说明:UNIT= unit。 (2)文件名指定:FIL

8、E=file。file是一个字符串表达式,也可以是常量或变量,其值可以是空格(不计尾随空格)、任何有效的数据文件名、设备名或指向一个内部文件的变量。此文件名与同一OPEN语句中的单元号连接起来。 文件名中可包含文件的完整路径,若未指定存盘的路径,则文件保存于工作目录下,即源程序文件所在的文件夹下。,STATUS=status。status是一个字符串表达式,其值由用户给出,可以是以下五种字符串之一: 可以是以下五种字符串之一: OLD:表示指定的文件是已经存在的老文件。 NEW:表示指定的文件尚不存在。 SCRATCH: 表示与单元号连接的文件为临时文件,在关闭文件或程序中断时将自动删除。此状

9、态不能与说明项FILE=file共存,它只能用于由系统指定的文件名,使该文件作为程序运行过程中的一个临时性文件。 REPLACE: 表示替代在磁盘上和指定文件名同名的文件。如果不存在这样的文件,则创建一个新文件。 UNKNOWN: 表示由计算机来规定文件的状态。,(3)文件状态说明:,(4)存取方式说明:,ACCESS=access。access是一个字符串表达式,此表达式的值可以是以下三种之一: DIRECT:说明存取方式为直接方式。 SEQUENTIAL:说明存取方式为顺序方式。 APPEND:说明是在所打开文件的最后一个记录后添加新的记录。 当省略此说明项时,则代表顺序存取方式。,(5)

10、记录格式说明:,FORM=form。form是一个字符串表达式,此表达式的值可以是以下三种之一: FORMATTED:说明记录按有格式的形式存放。 UNFORMATTED:说明记录按无格式的形式存放。 BINARY:说明记录按二进制的形式存放。 对于顺序存取方式,此说明项的缺省值为“FORMATTED”。对于直接存取方式,此说明项的缺省值为“UNFORMATTED”。如果既未设置存取方式,又未设置格式,则缺省为顺序存取的有格式文件。,(6)记录长度说明:,RECL=recl。recl是一个值为正整数的表达式,用于指定顺序存取文件的最大记录长度和直接存取文件的每条记录的长度。记录的长度单位为字节

11、。对于直接存取文件必须指定记录长度。,(7)出错处理说明:,ERR=err。err为本程序单元中某条可执行语句的标号,由用户指定。当OPEN语句操作出错(如指定的新文件已经存在等)时,并不终止程序运行,而是转向执行用户指定的这个标号其后的语句。如果省略此说明项,则没有这一功能。若同时不存在“IOSTAT=”项,遇到OPEN语句执行出错,系统将给出出错信息,终止程序运行。,(8)出错状态说明:,IOSTAT=iostat。iostat是一个整型变量。当执行此OPEN语句时,将由系统自动给此变量赋一个整型值。当输入输出操作没有发生错误时,其值为0;若已检索到文件末尾,则为一个负数;若发生错误,则为

12、错误信息代码。,如果打开一个已经存在的顺序文件,在进行输出操作前,未先将文件指针定位到文件尾部,新写入的内容将覆盖原文件。 在上述的所有选项中,各选项先后顺序没有规定。,11.2.2 CLOSE语句,CLOSE语句解除单元号与文件的联系,又称关闭文件。语句格式如下: CLOSE ( UNIT= unit , STATUS=status , ERR=errlabel , IOSTAT=iostat ) (1)单元号说明 (2)关闭文件后状态说明:STATUS=status。status是一个字符串表达式,由用户给出。其值可以为以下两种之一: KEEP:说明在关闭操作后,与单元号连接的文件保留下来

13、不被删除。 DELETE:说明在关闭操作后,与单元号连接的文件不予保留,被删除。,11.3 文件的读写,11.3.1 有格式顺序存取文件 READ ( UNIT= unit , FMT=fmt|NML=nml ,ADVANCE=advance , ERR=err ,IOSTAT=iostat , END=end , EOR=eor , SIZE=size ) 输入项表 WRITE( UNIT=unit,FMT=fmt|NML=nml ,ADVANCE=advance , ERR=err , IOSTAT=iostat ) 输出项表,输入/出项表中各项可以是变量名、数组元素名、数组名。各项之间用

14、“,”间隔。在READ语句中如果没有输入项,则每执行一次READ语句就跳过一个记录。在WRITE语句中也可以没有输出项,这时,执行该语句将产生一个空记录。 说明项包括以下各项: (1)单元号说明:UNIT=unit。,(2)格式说明或名字列表说明:,FMT=fmt | NML= nml。fmt可以是“*”号、FORMAT语句标号、字符型表达式或字符型常量。“*”号代表按表控格式输出。nml为名字列表名,FORTRAN90规定用NAMELIST语句来定义名字列表,即用一个名字来代表一组变量。名字列表控制的读/写只能用于顺序存取方式,例如: NAMELIST /na/a,b OPEN(2,FILE

15、=“example.txt“,ACCESS=“SEQUENTIAL“) a=1 b=2 WRITE( 2, na ) END,(3)说明是否为推进型的有格式顺序存取方式,ADVANCE=Advance。Advance为字符型表达式,有两种选项:“YES”或“NO”,缺省为“YES”。推进型方式在每次读/写操作后,将指针定位于记录尾。而非推进型方式允许读/写一个记录的一部分,然后将指针定位于此次读/写的最后一个字符之后。例如,执行以下程序段: OPEN(2,FILE=“example.txt“,ACCESS=“SEQUENTIAL“) WRITE(2,(A),ADVANCE=“no“) “Thi

16、s is “ WRITE(2,(A) “ an example.“,(6)文件结束说明:,END=end。end为本程序单元中某条可执行语句的标号。当读到文件结束标志时,转向执行用户指定的这个标号其后的语句。,(7)记录结束说明:,EOR=eor。eor为本程序单元中某条可执行语句的标号。此说明项只能用于非推进型的有格式顺序存取方式。当读到一个记录结束标志时,转向执行用户指定的这个标号其后的语句。,例11.3 按顺序存取方式在格式文件中写入三种不同类型的数据。,CHARACTER*20 string NUMBER=123 VALUE=987.65 STRING=“AN EXAMPLE“ OPE

17、N(8,FILE=“FILE11-4.TXT“) WRITE(8,100)number WRITE(8,200)value WRITE(8,300)string 100 FORMAT(I6) 200 FORMAT(F8.3) 300 FORMAT(A10) CLOSE(8)END,对顺序文件进行输入输出的基本规则:,(1)当用READ语句读入数据时,为了正确输入,READ语句中各输入项在类型和采用的格式说明上必须与输出语句的输出项一一对应。 (2)如果READ语句中的输入项少于记录中的数据项,则记录中多余的数据项被忽略,下一个READ语句从一个新的记录开始读入。如果READ语句中的输入项多于记

18、录中的数据项,如果没有说明项PAD=“NO“,则以空格填补记录(若该输入项为数值型,空格转换为相对应的数值0),直到所有的输入项都得到数据为止。,例11.4 从文件FILE11-4.TXT中输入数据,将数据显示在屏幕上。,CHARACTER*20 string OPEN(8,FILE=“FILE11-4.TXT“) READ(8,100)number,value READ(8,300)string WRITE(*,*) number,value,string 100 FORMAT(I6,F8.3) 300 FORMAT(A10) CLOSE(8) END,(3)一个WRITE语句总是开始一个新

19、的记录,但是形成新的记录还与FORMAT中格式的多次使用及斜杠“/”描述符有关。例如: REAL value(4) DATA value/1.2,2.3,3.4,4.5/ OPEN(9,FILE=“FILE11-16.TXT“) WRITE(9,100) value 100 FORMAT(2F10.3) CLOSE(9) END,(4)在顺序操作文件时,在读操作后立刻进行写操作,则当前写入的记录就成了文件的最后一个记录,此记录后的原有记录全部丢失。 (5)对于顺序存取方式,可以指定读/写记录的一部分。,例11.5 分析下列程序的输出结果。,IMPLICIT NONE CHARACTER ch*

20、10 INTEGER i,num OPEN(2,FILE=“example.txt“,ACCESS=“SEQUENTIAL“) WRITE(2,(26A1) (CHAR(i),i=ICHAR(a),ICHAR(z) REWIND(2) !退回到文件头 DO i=1,3READ (2,(A10),ADVANCE=“no“,EOR=100,SIZE=num) chWRITE(*,*) ch END DO 100 WRITE(*,200) “最后读入的数据长度为:“,num 200 FORMAT(1X,A,I2) END,11.3.2 有格式直接存取文件,对有格式文件进行直接存取时,在OPEN语句中

21、除了说明设备号、文件名外,一定要说明存取的方法ACCESS=“DIRECT“和记录的存取格式FORM=“FORMATTED“,并且要指定记录的长度。在进行输入/出操作时,READ语句和WRITE语句中多了一控制项:REC=rec。rec是一个值大于0的整型表达式,用来指定要读/写的记录的序号。,例11.6 将例11.3改用直接方式进行存取。,CHARACTER*20 STRING NUMBER=123 VALUE=987.65 STRING=“AN EXAMPLE“ OPEN(8,FILE=“FILE11-5.TXT“,ACCESS=“DIRECT“,& FORM=“FORMATTED“,RE

22、CL=10) WRITE(8,100,REC=1)NUMBER WRITE(8,200,REC=3)VALUE WRITE(8,300,REC=2)STRING 100 FORMAT(I6) 200 FORMAT(F8.3) 300 FORMAT(A10) CLOSE(8) END,例11.7 从文件FILE11-5.TXT中输入数据,将数据显示在屏幕上。,CHARACTER*20 STRING OPEN(8,FILE=“FILE11-5.TXT“,ACCESS=“DIRECT“, & FORM=“FORMATTED“,RECL=20,PAD=“NO“) READ(8,100,REC=1)NU

23、MBER READ(8,300,REC=2)STRING WRITE(*,*) NUMBER, STRING 100 FORMAT(I6) 300 FORMAT(A16) CLOSE(8) END,对直接文件的存取应遵循以下规则:,(1)如果输出的多个记录长度不等,则应该取最大的记录长度作为文件每个记录的长度。长度以字节为单位,由相应FORMAT语句格式规定的输出所占域宽来决定。 (2)用直接方式建立的文件可以采取顺序方式打开进行读/写。用顺序方式建立的文件,只要记录长度相同也可以用直接方式打开进行读/写。 (3)表控输入/出语句由于记录长度不能人为控制,因此一般不用于直接文件的存取。,11.

24、3.3 无格式顺序存取文件,对无格式文件进行顺序存取时,在OPEN语句中应说明FORM=“UNFORMATTED“,输入/出语句中没有格式说明这一项,其它都和有格式顺序存取方式一样。,例11.8 以下程序按顺序存取方式生成一个无格式文件。,INTEGER(4) NUMBER(35) REAL VALUE CHARACTER*20 STRING DATA NUMBER/35*-1/ STRING=“AN EXAMPLE“ OPEN(20,FILE=“FILE11-7.TXT“,FORM=“UNFORMATTED“) WRITE(20)NUMBER WRITE(20)STRING CLOSE(20

25、) END,11.3.4 无格式直接存取文件,无格式的直接存取方式在OPEN语句中说明存取方式ACCESS = “DIRECT”和格式FORM = “UNFORMATTED” ,并指定记录长度。输入/出语句中不需指定格式,但要指定记录号。 OPEN (3, FILE=“FILE11-8.TXT”, RECL=10,&FORM = “UNFORMATTED”, ACCESS = “DIRECT”) WRITE (3, REC=3) .TRUE.,”Direct” WRITE (3, REC=1) 2049 CLOSE (3) END,11.3.5 二进制顺序存取文件,对二进制文件进行顺序存取时,

26、在OPEN语句中应说明FORM=“BINARY”,输入/出语句中没有格式说明这一项,其它都和有格式顺序存取方式一样。 INTEGER(1) ints(4)CHARACTER(10) cvar(3)DATA ints /1,2,3,4/DATA cvar /“Sequential“,“Binary“,“File“/ OPEN (3, FILE=FILE11-9.TXT,FORM=BINARY) WRITE (3) ints WRITE (3) cvar(2),“*“,cvar(1) WRITE (3) cvar(3) CLOSE (3) END,11.3.6 二进制直接存取文件,无格式的直接存取

27、方式在OPEN语句中说明存取方式ACCESS = “DIRECT“和格式FORM = “BINARY“,并指定记录长度。输入/出语句中不需指定格式,但要指定记录号。打开二进制直接存取文件,可以指定访问任意一个记录。一次单独的读写操作可以通过把操作延续到下一个记录来传输更多数据。而对一个无格式的直接存取文件进行同样的操作会产生错误。假若操作不依赖于不完整记录中填充的0,对无格式直接存取文件有效的输入输出操作如果用于二进制直接存取文件会生成同样的结果。,例11.11 以下程序以直接方式在二进制文件写入三种类型的数据。,OPEN (3, FILE=FILE11-10.TXT, RECL=10,&FO

28、RM = BINARY, ACCESS = DIRECT) WRITE (3, REC=3) .TRUE.,Direction WRITE (3, REC=1) 2049 CLOSE (3) END 和无格式直接存取的文件FILE11-8.TXT相比较,二进制直接存取文件允许读写的数据长度超过指定的记录长度,例如,在FILE11-10.TXT的OPEN语句中,指定记录长度为10,而第一个输出语句中数据长度达到13,程序运行时将多余的数据写入下一记录,不会发生错误。,11.3.7 内部文件,内部文件用字符串或字符数组作为单元标识,有两种类型的内部文件: (1)以字符变量、字符数组元素、非字符型数

29、组元素作为单元标识,它仅有一个记录。 (2)以字符数组名、字符派生类型名、非字符型数组名作为单元标识。由于字符数组、字符派生类型、非字符型数组有多个元素,每个元素就是一个记录。当输入内部文件的数据的长度少于一个完整记录要求的长度时,剩余部分自动以空格填补。通过内部文件,利用格式输入输出可以实现内存和外部字符表示之间值的相互转换。,(1)用READ语句将ASCII码转换成数值型、逻辑型、字符型。,例11.12 分析下列程序的输出结果。 CHARACTER str(2)*10,ch(2)*10,ch1(2)*10 REAL n(2) LOGICAL lo DATA str/ 1.23 2,.TRU

30、E./ READ(str(1), 200) n ,m !字符型转换成数值型 READ(str(2), *) lo !字符型转换成逻辑型 READ(FORTRAN FILE, *) ch1 READ(FORTRAN FILE, 100) ch !截取字符串 100 FORMAT(2A10) 200 FORMAT(2F3.1, I3) WRITE(*,*) n, m,lo,ch1(1),ch(1), ch1(2),ch(2) END,(2)利用WRITE语句将数值型、逻辑型、字符型转换成ASCII码。,例11.13 假设磁盘上有70个文件,文件的主文件名首字符都为“F”,后两个字符为文件序号(如F

31、01.DAT),编写程序,实现根据输入的序号打开相应文件。 CHARACTER fname*7 WRITE( *, *) “请输入两位数的文件序号:“ READ( *, *) i WRITE (fname, 200) I !合并字符串 200 FORMAT (F, I2, .DAT) OPEN (11, FILE = fname) WRITE(11, *) Fortran90 END,因此,程序运行后,输出结果为:,11.4 其他文件操作,11.4.1文件的定位 文件中有一个位置指针,指向当前读/写位置。如果按顺序读/写一个文件,每次读/写一个记录,则读/写完一个记录之后,指针自动指向下一个记

32、录的位置。如果想改变这样的规律,强制使位置指针指向其他指定的位置,可以使用相关语句。,1. REWIND语句,REWIND语句称为反绕语句,它使文件的位置指针退回到第一个记录,通常用于顺序存取文件的操作。语句格式如下: REWIND (UNIT= unit , ERR= errlabel , IOSTAT=iostat ),例11.14 有一个文件FILE1.TXT,第一次把它复制到另一个文件FILE2.TXT上,第二次使它显示在屏幕上。,OPEN(10,FILE=“FILE1.TXT“) OPEN(11,FILE=“FILE2.TXT“) DO WHILE (.NOT. EOF(10) RE

33、AD(10,(I10)K WRITE(11,(I10)K END DO REWIND(10) DO WHILE (.NOT. EOF(10) READ(10,(I10)K WRITE(*,*)K END DO END,2. BACKSPACE语句,BACKSPACE语句称为回退语句,它使与单元号连接的文件的指针从当前回退一个记录位置,通常用于顺序存取文件的操作。语句格式如下: BACKSPACE (UNIT= unit , ERR=errlabel , IOSTAT=iostat ) BACKSPACE语句不能用于跳过按表控格式或名字列表格式写入的记录。,11.4.2 PRINT语句和ENDF

34、ILE语句,PRINT语句 用于将数据输出至屏幕,语句格式如下: PRINT * |formatspec | namelist , iolist ,2ENDFILE语句,用于在文件的当前位置写入一个文件结束记录,并将指针定位于该记录之后。语句形式如下: ENDFILE(UNIT=unit ,ERR=errlabel,IOSTAT=iostat) OPEN(6,FILE=“file11-2.txt“) WRITE (6, *) 123.45 ENDFILE(6) BACKSPACE(6) !退回到文件结束记录 BACKSPACE(6) !退回到尾记录 READ (6, *) Y END ENDF

35、ILE语句用于顺序存取文件时,会删除文件结束记录后的所有记录。,11.4.3 INQUIRE语句和EOF语句,1INQUIRE语句 INQUIRE ( UNIT= unit | FILE=file | IOLENGTH=iolength , EXIST=exist , NAME=name , NEXTREC=nextrec )output list,(1)查询方式说明, 基于单元号的查询:UNIT= unit。Unit为整型表达式或“*”号。这种方式如果说明项中包含“NUMBER= ”,则程序运行时会发生错误。 基于文件名的查询:FILE=file。file为字符型,指定要查询的文件名。 基于

36、文件长度的查询。IOLENGTH=iolength。iolength为长整型,返回要查询的输出列表的长度。这种方式不可有其他说明项,后面必须有待查询的输出项。这种方式可以用于确定无格式输出数据的记录长度。,CHARACTER*30 book WRITE(*,*) “请输入书名:“ READ(*,*) book WRITE(*,*) “请输入定价:“ READ(*,*) price INQUIRE(IOLENGTH = i) book,price OPEN(6,FILE=“FILE2.TXT“,ACCESS=“DIRECT“,RECL=i) WRITE (6,REC=1) book,price

37、END 直接存取方式文件时缺省为无格式。通过查询输出列表的长度,指定打开文件的记录长度,这样可以避免因为指定长度过短导致数据不完整或指定长度过长而浪费存贮空间。,其他说明项,EXIST=exist。exist为逻辑型变量,如果文件存在返回.TRUE.,否则返回.FALSE.。例如查询磁盘当前文件夹下有无文件“readme.txt”存在: INQUIRE (FILE = “readme.txt“, EXIST = ex ) NAME=name。name为字符型变量,用于基于单元号的查询,返回连接的文件名。 NEXTREC=nextrec。nextrec为整型变量,返回直接存取文件的下一个记录的记录号。,2EOF语句,EOF语句检测文件是否正在或在文件结束记录之后,决定在当前位置后记录是否保留,语句格式如下: result = EOF (unit) 说明项unit是值为整型的算术表达式,由用户给出,指定外部单元。返回值为逻辑量,若文件指针指向文件结束记录或之后的记录,返回值为.TRUE.;否则返回.FALSE. 。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报