Fortran95第16章-数据文件的管理.docx
第16章数据文件的管理当然,我们编制一个科学计算程序的目的是执行给定的计算.是描述一个通过算法而实现的对输入数据的计算的过程,而不只是简治的对数据的处理,但是这并不阻碍我们从信息处理的角度来看待这个过程.,因为任何的计算,再简洁也必定包含数据的输入与输出过程.史困难的计算程序则还包含数据的缓存管理,不同程序单位之间的数据传递,特殊是在程序的计切涉及到浩大的数据M时,例如在工程计算中常见的大数组等,更加不能依斌单纯的变及来管理浩大的数据城。事实上分析一下我11自己进行计算的情形,就知道在计算过程当中进行数据管理同样是一件特别更要的事务,而依据计交机的从冯纽姓时代就已经赐予奠基的基本模型来看,一台计兑机的有效工作,依今于指令流与数据流的有机合作,BlFORTRN语言除了要描述计比,还整能的描述时于数据流的管理。在前面我们已经探讨/K)RRAN程序的内部通讯何虺,那种通讯完全是依靠变量机制来进行的,因为那种通讯都是紧密关联于计算的通讯.干脆在变质之间进行数据值的交换能终保证计徵的效率和速度。但是一旦计算所涉及的数据法特别浩大,而计算过程对于数据的输入1.j输出要求更加困难时,变让机制就不足以担当数据处理的功能.因此FORTRAN供应了单独的输入蚪出语句以及文件的概念,来实现对数据流的输入输出的管埋.除了作为面对程序自身的数据输入输出管理的功能之外,一个FORTRAN程序的完整运行还必衢包括程序与人的交互,而一旦涉及到机器与人的交互,自然要求任何数据都必需以相宜于人的辨识与处理的格式出现于肯定的物理媒质上,这就是珀人与输出的编辑问题.将是下章所要探讨的内容,本章则只说明FoRTRAN所供应的输入输出处理语句。FORTRAN用于处理与管理输入输出数据的语句分为如卜四大类: 文件联结谙句包括OPEN语句和C1.OSE语句. 数据传输语句。 一类语句又可以分为2个小类别: 据传输ft入语句,包括READ语句. 据传输输出语句,包括WRrrE语句和PRINT语句。 文件定位语句。包括BACKSPACE借句.ENDH1.E语句以及REWIND谙句. 文件查询语句,包括INQUIRE语句.这些谱句所要实现的筲要的功能.就是限制数据的输入与输出,即数据从外部媒质到内存,或从内郃文件到内存的输入,以及数据从内存到外部媒质,或从内存到内部文件的输出.然后就是协助性的用来操纵外部媒物,以及描述或食询文件与外部媒顷的联结屈性的功能。下面在给出FORTRAN管理数据输入输出的一般概念之后,再分别具体探讨这代语句.16.1 输入输出管理的数据单位FORTRAN对于输入输出数据进行管理的基本单位概合是纪录以及纪录如成的文件,因此下面我们分别探讨纪录与文件概念.16.1.1 纪录FoRTRAN的变量一次只能存储一个数据fi,明显不足以用来迸行有效的数据管理,因此FoRTRAN建立了特地的用来有组织地存储的总数版的数据的概念,即文件.文件由一个纪录的序列级或,而纪录是一种逻辑形式上的单位,可以是终然或打印输出上显示的一行,也可以是外部存储器上的一个逻辑纪录,尽管纪录总是与各种物理形式的数据单位保持肯定的对应,但事实上是与具体的物理表现形式无关的,因为纪录本质上是一个语法上的概念.*实上在FORTRAN里面并不存在物理纪录的概念.组成个文件的纪录从语法地位上分为如下两种: 数捌纪录: 文件终止纪录.所谓数据纪录就是作为文件的数据内容的纪录,而文件终止纪录则纯粹是个语法意义上的纪录,它不包含任何数据内容,只是用来标记一个文件的终止。因此文件终止纪录只能用作文件的最终一个纪录,并且没有长度的属性.由于计算机本质上的中行工作模式,纪录同样是一个申行序列的结构,该序列的单位就是数据值,即一个数据信的序列组成一个纪录.对于数据纪录来说,其中的数据他可以有如下两种表示形式: 无格式数据: 格式化数据。所谓数据的是否具有格式,完全是针而人而言的,即具有格式的数据就是把数据转化为便于人的阅读的字符型数据表示形式,也就是文字与数字,或者说ASCII编码形式:而所iH无格式数据就是FoRTRAN程序自身所实际处理的数据的在物理层面上的表示形式,殷都是二进制表示的数字形式。时于计算机来说,世界上的任何形式的信息,终归都要表示为这种形式的数据.个TORTRAN程序所涉及到的任何数据,在该程序运行时,无论是作为运行的结果还是作为运行的初始值,它写入到内存当中,或从内存当中读出,或者是从内存到硬盘的输入输出,数据流里面的数据都是无格式数据.而一旦数据须要人的阅读,就必需把二进制数据形式转换为健修被人阅读的字符形式.犷实上我们桀写的源码就是这种形式的数据,个数据纪录或者完全由无格式的数据组成,称为无格式纪录;或者完全由格式化数据组成称为格式化纪录.无格式纪录完全只是在机器内部存在,它的具体的数掘形式是由系统确定的,最常见的就是二进制形式,这种纪录完全不须要人的监视与阅读,而格式化纪录则完全是人用来给机涔输入数据.或机器向人展示数据结果的数据纪录形式,因此当人向机器输入格式化纪录后,机器必箭再把它翻译为无格式的纪录,才能被程序所运用,反之亦然.格式化纪录的好处就是使于人的阅读.它只能通过格式化输入帖出语句来读或写:而无格式的纪录的特点就是能帔I:脆得到机涔的处理,相应的它也只能通过无格式的输入输出语句来读或耳。对于纪录可以定义长度的概念.格式化纪录的长僮就是其所包含的字符的数目:而无格式纪录的长度同样用来计量其中数据信的大小,它的具体度属方法的定义则依益于具体的处理器系统对于数据玳单位的定义,格式化纪录和无格式纪录的长度都可以为0,除了包含数据值的纪录之外,还有文件终止纪录。由于它只是起文件终止的语法标记作用,因此它不包含任何数据,所以它的长度也就是Q.一个文件至多只能包含一个文件终止纪录,并且只能是文件的终一个纪录,文件终止纪录可以有如下几种生成方式: 可以通过文件的序列访问,最终用一个ENDH1.E语句品式地写下来: 也可以通过文件定位语句,如REWIND语句或BACKSPACE语句,而吃式地写下来: 运用C1.OSE语句关闭文件或部件,或者是正常地终止程序,或者是对同一个部件运用了另外一个OPEN语句,从而隐式地写下来.从上面的文件终止纪录的实现方式可以看出,这种纪录并不须要任何实际的物理实现“16.1.2 文件一个纪录的序列构成一个文件.在程序运行的任何时候,对于一个给定的文件,它的访问方法,形式,操作以及纪录的长度,都明确地存在相应的依粘于系统的合法性规定,同时文件也可以具有字符串类型的名称.即所谓命名文件,不过对于该名称所运用的字符形式或氏度,都是由具体的系统来规定,以便与相应操作系统对于文件的命名约定保持一样,依据文件与程序的功能关系以及行储性脑,文件可以分为如卜两种: 内部文件: 外部文件。所训内部文件存储在程序可以访问的内存空间里面,而外部文件则存储在系统的外部存储部件上,例如硬盘,这种存储位置的不同事实上也反映了它们对于程序的不同功能.因为这两种存储空间的物理性能整并确定J'它们对于CPU是具有不同意义的.外部文件与内部文件的这种不同功能懑义体现在如下几个不同的方面: 文件的存在性。对于外部文件来说,程序须要访问的一个外部文件可能是存在的,也可能是不存在的.表是合法的程序运行现坡.例如INQUlRE语句,OPEN语句,C1.oSE语句,WRITE语句,PRlNT语句,REWIND语句,以及ENDFl1.E语句都可以引用一个并不存在的文件;而假如运用WRITE语句.PRINT谱句.或ENDFl1.E语句来引用个预联结的并不存在的语句.就臼然地能够生成该文件.一个外部文件的不存在也可能是来源于系统对于硬盘空间的权限限制,例如对于一个FORTRAN应用程序来说.系统文件以及FORIKAN循译;程序文件都不应当被访问.而对于程序来说,它所涉及的内部文件则都必需存在于相应的内存空间里面。 程序对外部文件的访问须要通过与逻辑部件建立联结因此就须要相应的能桃对外部文件进行联结,定位与查询的语句,而对于内部文件则不须要这些语句功能.同时这种联结就使得外部文件具有定位的属性, 对干外部文件来说,它的访问方式.合法形式.合法操作.以及合法纪录长度等都不是由H)RTRAN追古标准来现定,而是由操作系统对于文件的约定以及用户的特定选择来确定的:而内部文件的内容都是作为默认字符型变量的数据值的形式而储存的,这些字符型数据tfi都是程序的通常的赋值过程所产生的,或者是输出语句针对变St而给出的.假如内部文件所表示的变量是一个标破,那么该文件就只有一个纪录:假如该变量是一个数组,那么该数组的年一个元素纲成该文件的一个纪录,文件里面纪录的依次就是数组的相应的元素依次,每个纪录的长度就是相应元素的长度.16.1.3 文件的访问由于文件的纪录是一种电行的序列结构,要实现对文件的纪录的访问,可以有如卜两种方式:序列访问:干腌访问。所谓序列访问,就是顺着文件的纪录序列来访问特定的纪录.即假如要访问文件的笫n个纪录,则须要顺次羟过文件的第1.,始终到第n-l个纪录,才访问到第n个纪录:而干脆访问则不须要经过前面的n-l个纪录,通过指定纪录号即可干脆访问第n个纪录,因此干脆访问无论是读还是写.都可以依据随意的依次进行.这两种不同的访问方法很大程度上是由存储文件的媒历以及系统的约定等外部因素确定的,例如存储在租带上面的可能就只允许采纳序列访问的方式进行访问。不过当一个文件被联结到了一个特定的部件之后,或者是预联结的文件被生成之后.它的访问方式就已经被确定了.这两种不同的访问方式是由时文件的联站方式酬定的,而不是舄5文件自身的屏性,一个文件可以只能通过井列访问方式呆访问,也可以只能通过干脸访问方式来访何,也可以分别通过这两抑方式,来访问,但不能同计用这两种方式来访问.也就是说当文件通过某个联练而被理序依据序列方犬来访问,昨么须要运用C1.OSE诲句来关用祓联结之后,再运用OPEN语句支新定立新的联结,才能换为依媒干脆访问的方式来访问.能陆干脆访何读的纪录只FI1.于已接写下汆的纪录.检物干他访何写的文件限于也立了干脆访问联都的文件。1 .序列访问一个外部文件建立了序列访问的联结之后它就具有如下的属性: 假如针对该文件的干脆访问是非法的,那么组成该文件的纪录的依次就是写入该文件的纪录依次;假如同时针对该文件的干脆访问也是合法的.那么该文件的纪录的依次由干脆访问来确定,即序列访问该文件的第一个纪录就是干脆访问该文件所指定的纪录号为I的纪录,后面顺次类推. 文件的纪录或者全部是格式化纪录.或者全部是无格式纪录.当然有可能出现在文件最终的文件终止纪录除外只要该文件的前一个引用不是数据传怆输出语旬或文件定位语句,那么文件的最终一个纪录就肯定是文件终止纪录。 文件的纪录不允许干脆访问输入辎出语句的读与写.2 .干脆访问线如一个外部文件所建立的联结是干脆访问.那么该文件具有如下属性: 文件的全郃纪录都具有一个唯一的纪录号,该纪录号为一个正整数.是在写纪录时给定的,而这个纪录号一旦给定,就再也不能变更.该纪录号确定了文件的纪录的依次. 文件的任何纪录不允许被删除,但允许被改写. 文件的纪录或者全部是格式化纪录,或者全部是无格式纪录.置如对于该文件序列访问方式也是合法的,那么当该文件被联结到干脆访何时,它有可他包含的文件终止纪录则不被认为是减于该文件的一部分.黄如对于该文件不允许序列访问,那么该文件就不能包含文件终止纪录. 只有通过干脆访问输入输出语句才能实现时纪录的读和写. 文件全部的纪录的长度相同. 对于一个文件的纪录的读写依次不肯定要求依据纪录号的依次.一旦文件与部件建立了联结,那么对于该文件的纪录的读写可以是班意依次的。 文件的纪录不能运用表控格式,名林列表格式,或通过非预输入输出语句来读写。16.1.4文件的定位由于文件是一个数据的集合,因此程序在运行过程当中,时于文件的读写操作总是意味若程序当前所运用的数据是在发生变更的.为了描述程序当前所运用的数据或纪录,FORTRAN定义了文件的位比的概念,并且还给出了特地刖来对文件位置进行耀作的语句,以便实现时文件所包含的数据的精确访问与操作。针对文件所包含的纪录的邪行序列结构,以及纪录本身所包含的数据值的串行序列结构.FORTRAN定义了如下几个特征性的文件的定位情形: 初始点.即文件第一个纪录前面紧接该纪录的位置。©如文件定位在这个位置,那么程序对于该文件的操作将从文件的第一个纪录起先. 终止点.即文件最终一个纪录后面紧接该纪录的位徨。假如丈件定位在这个位巴,那么程序接下来的操作将不进入该文件.假如文件为空文件,即不包含任何数据那么它的初始点和终止点相同 对于文件的定位可以处于两个紧接的纪录中间,这时位于该位汽的前面的那个纪录称为第纪录,而位于该位置的后面的那个纪录称为后纪录.当然对于初始点不存在的纪录,而对于终止点则不存在后纪录. 对于文件的定位也可以是在输入输出语句运行时的当前纪录上面,这时该当前纪录的紧接的前面的那个纪录称为其前纪录,而该当前纪录的紧接的后面的那个纪录称为其后纪录.当然.假如文件定位不是在一个纪录里面.那么当前纪录就不存在.当文件定位处于当前文件时还可以更加具体地描述为定位于当前纪录的数据值序列的初始点或终止点,或纪录的随意两个数据值之间,即该纪录的紧接在数据伯序列的笫个数据值前面的位置,或紧接在数据值序列的最终一个数据值后面的位.置,或在数据值库列里面的随意两个数据值之间的位置. 内部文件总是在数据传输之前定位在纪录的起先位置. 预输入输出愫作总是以纪录为单位的,因此完成这样个操作之后,文件总是定位于一个纪录的终止位置或纪录之间的位置;而非预输入输出操作是以字符为单位的.因此完成一个非预输入输出操作之后,文件有可能定位于当前纪录的字符序列之间.输入输出用句的运行总能影响外部文件的定位,依据作用效果的不同,输入输出语句可以分为如下两种; 预物入黔出谱句.一个预输入输出语句总是在文件的最终一个纪录完成读写之后对文件定位,除非中途发生错误。 非预输入输出语句。个非预输入输出语句可以定位于当前纪录里面的字符位置,或行是随后的纪录上面.运用非Bi输入输出语句就可以通过一个输入输出语句序列读写文件的纪录,其中姆个语句访问纪录的一部分。这种语句也可以用来读可变长度的纪录。在数据传输之前的文件的定位在干脆访问文件与序列访问文件时有不同的约定: 序列输入时,假如存在当前纪录,那么文件定位不变:否则文件定位于下一个纪录的头部,自然该纪录就成为了当前纪录.假如这个纪录不存在,或者在存在当前纪录,而最近访问文件的数据传输语句执行的是输出,那么该输入就不执行. 假如文件包含文件终止纪录.那么在数据传输之前文件不能定位于文件终止纪录后面.UJ以运用REWIND语句和BACKSPACE语句来对文件重定位。 序列尬出时,假如存在当前纪录,那么文件定位不会变更当前纪录成为文件的最终纪录;假如不存在当前纪录,那么就生成下一个纪录作为文件的当前纪录,文件定位于该当前纪录的头部。 假如是干脆访问.文件的定位情形特别简洁即定位于纪录说明符所指定的纪录的头部.该纪录就是文件的当前纪录.在数据传输过程结束之后,文件的定位有如下几种情形: 假如数据传输过程了发生错误,那么文件定位就是不行预知的. 假如数据传蚪过程没有发生错误,但是读入了文件终止纪录而导致文件终止,那么文件定位于文件终止纪录之后。 对于非预输入假如没有出现错误,也没有出现文件终止条件,但是出现了纪录终止条件,那么文件定位于刚读入的纪录之后:假如纪录终止条件也没有出现,那么文件定位不变. 对于非预输出假如没有出现错误,则文件定位不变。 在全部的其他状况下文件定位于刚读写过的纪录之后.该纪录就成为了前纪录.16.1.5内部文件内部文件的概念是FORTRAN谱言的一个很大的特点,它实现了数据从内存到内存的传输与转换的功能,内部文件的属性与约定如下: 内部文件为默认字符型变量,不能足带向量下标的数组片断. 内制文件的纪录为标艮字符变出. 假如文件本身就是一个标号字符变眼,那么该文件就只包含一个纪录,其长度就是标量字符变地的长度。线如内部文件是一个字符数组.那么它就被百成是一个字符数组元素的序列,其中的每个元素都是该文件的一个纪录,该文件纪录的依次就是该数组或数组片断的数组元素序,该文件的母个纪录的长度都相同,即数加元素的长度. 写入内部文件纪录的同时就定义了该纪录.故如写入字符数目少于纪录长度,那么纪录多余的空间就被填上空字符.写入的字符数目不能超过纪录长度. 只有在内部文件的纪录被定义之后,才能谀入该纪录。 内部文件的纪录除了通过输入语句之外,还可以运用其他方法得到定义或去定义,例如字符赋的语句也能膨定义作为纪录的字符变Ift, 在数据传输之前,内部文件总是定位于第一个纪录的头部,而该纪录就是当前纪录。 在输入内部文件时,时空格的处理与运用具有值NU1.1.的说明符B1.ANK=来打开外部文件一样.在必要的时候纪录可以添加空格. 在表控输出时,字符常取不能定界, 内部文件纪录的读与写只能通过不说明名称列表格式的序列访问格式化输入输出语句来完成. 内部文件不能出现在文件联结语句,文件定位语句以及文件查询语句当中.16.2文件的部件联结与访问程序要和文件进行过讯,都须要程序通过肯定的部件联结到文件,即通过部件输出数匏到文件,通过部件从文件输入数据到程序,这里的所谓部件是一个纯悴的逻辑概念,而不是一个物理概念,之所以要引入这么一个逻辑概念.主要的缘中就是为了在谱吉里获得对输入输出的通用描述.因为我们知道文件概念事实上是与操作系统与硬件存谛形式亲密相关的.不同的操作系统与硬件存谛形式里面,对于文件往往有不同的形式妁定,因此为了使得对输入输出能终有不依然于具体系统的描述,FORTRAN里入了部件这个设物概念作为数据从理序到文件之间的桥梁.部件运用如下的语法我示方法(R901卜io-unit其中的输入输出部件(Hunit)可以具有如下三种形式之一,Cxtcmiibfilc-Iinili11(cmul<file-unit其中外部文件部件的表示形式为标T第里表达式或者是一个星号,而内部文件部件的表示膨式为默认字符型变H1.部件的一般规则如下: 表示内部文件部件的默认字符型变琏不能是带有向量下标的数飙片断, 一个部件可以作为外部部件也可以作为内部部件.外部部件用来联结外部文件:而内部部件用来联结内郃文件. 假如表示内部文件部件的字符型变最是指针,那么该指计必需是获得了关联的. 假如表示内部文件部件的字符型变量是一个可安排数组,或者这样一个数组的对默,那么该数组必需是当前可安排的.表示外部文件部件的标E集型表达式必需是O速正整数, 出现在文件联结语句,文件定位语句,以及文件查询语句当中的输入输出部件只能表示外部文件部件. 在一个程序的全部程序单位里面,一个表示外部文件部件的标状整型表达式的信,表示同一个外部部件 星号表示预先联结用来进行格式化序列访问的特定的与系统相关的外部部件. 对于一个给定程序,在K1.位的时间总型存在一个与系统相关的外部部件集合.全部的输入输出语句都可以运用存在的部件,而INQUIRE语句和C1.OSE语句还可以运用不存在的部件.【例16-11SUBROUTINEAREAD(6)XSCBROfHNEBN=6REWINDN在这个程序例子里面,两个不同的程序单位里面出现的外部部件名称6表示同一个外部部件.16.2.1 文件到部件的联结与预联结一个外部部件可以被联结,也可以不被联结,这两种状态都是合法的,外部部件通过预猴站或通过运用OPEN语句而获得与一个外部文件的联结,正是这种联结使得外部文件能鲂被程序访问。这种访问也就是输入输出语句的功能所在,或者精确地说是除7OPEN语句.C1.OSE谙句,以及INQUIRE语句之外的全部输入输出语句因此而能膨通过外部部件而访问相应的外部文件或时相应的外郃文件进行操作.文件到部件的联结与预联结的一般规则如卜:一个文件可以与部件建立联结但本身却还不存在,例如一个已经建立了预联结的文件,但可能还没有被写入.一个部件在同一个时间不能联结多于一个文件;而一个文件也不能在同一个时间与多于一个的部件相联结。 执行C1.OSE语句之后,相关的外部部件就失去了联结.然后在同一个程序单位里面.该部件仍旧可以依据程序的然要再次与同一个文件或不同的文件隹立联结。类似的,执行C1.OSE语句之后,相关的外部文件也失去了联结,然后在同一个程序单位里面,该文件仍IH可以依据程序的须要而再次与同一个部件或不同的设备建立联结。 一旦一个文件失去了联结,那么河次引用该文件的唯一方法就是在OPEN语句或INQUIRE语句里面引用该文件的名称,而叙如失去联结的文件没出名称,那么就无法使得它再次获得联结. 对于内部部件来说,总联结到由标记该部件的默认字符型变量所给出的内部文件、 一旦部件与文件建立了联结,那么也就意味若建立了访问的方法,或者是序列访问,或者是干脆访问. 一只与一个已经存在的文件或者是通过联结而生成的新文件建立联结,那么就会建立相应的格式化或非格式的数据格式.段如联结是通过执行OPEN语句而建立的,那么在没有.指定数据格式的情形下给出数认数据格式:假如联结为段联结到一个已经存在的文件,那么数据格式田预联结建立:假如预联结到一个不存在的文件,那么数据格式可以建立,也可以推迟到文件生成之后再建立,例如运行格式化或非格式的WRITE语句之后。16.2.2OPEN语句OPEN语句的功能就是建立初始的外部文件与指定部件之间的联结,或拧是强改该联结.具体地说,一个OPEN语句可以产生如卜几种作用: 联结一个已经存在的文件到部件: 产生一个已羟预联结的文件: 产生一个新的文件然后把它岷结到指定部件; 变更一个文件与部件之间联结的特定说明符.OPEN谙句的谱法形式(R904)为:OPEN(connect-spec-Iht>其中的联结说明(COrUWCzPeC)的语法形式(R9O5)有以卜几种:IUNrr=Ie.cmal-filcuiIOSTAT=scahrdefaullinlvanableFRR=labelFI1.E=fllc-na11c-<xprSTAT1.>S=scala-dcfauhar-cxrACCESS-scalar-defaull*ciarcxprFORM=cnkr-defau1t-chM-cxprREC1.=scalarint<xprB1.ANK-scalar-dcfault-car-cx<PoSnlON=calar-<k(3ull-cl»re.i|>rAeTK)N=Scabndefnull-Chiir-CxprDEUM=ScalardcfauliYlur-CKprPAD=ScaIarskfauk-Clttr-CXpr其中的文件名称表达式(Hc-namcYxpr)为标址默认字符型表达式(R9061.OPEN语句的一般观则为: 假如在部件说明符里面省略可选字符UNIT=.届么岷结说明列去(ConneczpeeIM的第一项必需是部件说明符. 在一个给定OPEN沿句里面,任何说明符都至多只能出现一次:其中必猫给出外部文件部件(cx<emalfleunit). 在说明符ERR=里面给出的语句标签必需是与该OPEN语句同一个作用域单位里面的分支目标谙句的标签. 假如说明符STATUS=的位为NEW或REP1.ACE.那么说明符FI1.E=必诲同时给出.©如说明件STATUS=的值为SCRATCH.那么说明符Fl1.E=不能同时出现。粮如说明符STATUS=的值为O1.D,那么说明符Fl1.E=必需出现,除非部件当前联结到一个文件,井且该文件存在. 说明符当中出现的标"默认字符表达式为字符的有限列表,尾部的空格被忽视,假如系统同时支持大小写,那么字符取值不区分大小写. 在一个程序的随意程序单位里面.一只一个外部部件通过OPEN语句获得联结,那么在该程序的随意程序单位里面都可以引用该部件。 假如一个部件已经联结到一个存在的文件,仍用可以对该部件执行OPEN语句.假如在该OPEN语句当中不包含H1.E=说明符,那么与该部件联结的文件就是已经与该部件联结的文件, 假如与部件联结的文件并不存在,但是和己经与部件预联结的文件相同,那么由OPEN语句给出的属性成为联结的一部分. 假如通过OPEN语句联结到部件的文件与己羟与部件联结的文件不同,那么这个OPEN语句的执行效果相当于:在执行OPEN语句之前,立刻执行一个不带有STATUS=说明符的C1.OSE语句。 假如逋过OPEN谙句联结到部件的文件与已经与部件联结的文件相同.只是当前起作用的B1.ANKjDE1.lM=.PAD=,ERR=,以及IOSTAT=这些说明符的值不同,那么会产生如下后果: 假如OPEN语句当中包含POSmON=说明符,那么它的值可能与文件的当前定位不符. 假如OPEN语句当中包含STATUS=说明符,那么它的ffl为O1.D B1.ANK=.DE1.IM=.PAD=这此说明符的值发生作用,而其他没有出现的说明符不会发生变更,文件的定位也不会发生变更. 此前.执行的任何OPEN话句的ERR=,以及IoSTAT=这些说明符对当前执行的OPEN语句没有影响。 假如通过OPEN谱句联结到部件的文件与已经与部件联结的文件相同.那么具行值Ol-D的说明符STATUS=总是合法的,这时假如文件在执行OPEN语句之前的状态为SCRATCH,那么在部件关闭后,文件被删除,并且认为具有SCRATCH状态。 假如一个文件已经与一个部件建立联结,那么对该文件运用OPEN谱句使其与另外一个不同的部件建立联结是非法的.【例16-2)OPEN<10.R1.E=enloycc.names,ACTION=READ,PAD='YES>下而更加具体地说明OPENiS句当中所运用的各种说明符的含义.1FI1.E=说明符FI1.E=的值就是与给定部件联结的文件的名称.它尾部的全部空格郎被忽视.而文件名称表达式必需是系统的合法名称,假如在OPEN语句当中省略该说明符,并且部件也没有与文件建立联结,那么说明符STATUS=给出(ftSCRATCH,这时部件联结一个依然具体系统的文件.2STATUS= 其中的标ht默认字符农达式取tft为O1.D.NEW,SCRATCH.REP1.ACE.以及UNKNOWN, 当说明符取值为O1.D时,文件存在,而取值为NEw时,则文件不存在。 当具有值NEW的OPEN语句胜利运行之后,生成相应的文件.然后状态力然转变为O1.D. 当取值为REP1.ACE时,假如文件不行在,那么OPEN语句生成个新文件,然后状态取为O1.D:而假如文件已经存在,则该文件被删除,OPEN谙句生成一个新文fl.具有J被捌除文件相同的文件名称,然后状态取为O1.D. 假如取信为SCRTCH,则生成文件井艇站到指定的就件,以供程序运用,然后在执行引用同一个部件的C1.oSE语句之后,或者是程序终止之后,该文件被删除. SCRACH不能用于命名文件. 假如取(ft为UNKNoWN,则具体的状态依能于系统的约定.假如说明符被省珞f,则默认值就是UNKNOWN.3ACCESS- 其中标M默认字符表达式的取值为SEQUENTIA1.或DIREC1.分别表示文件联结的访问方法为序列访问或干脆访问. 假如该说明符被省略,则默认取值为SEQUENTlA1. 假如联结文件己经存在,那么该说明符指定的访问方法必需对于该文件是合法的” 假如文件不存在而须要生成新文件,那么说明符指定的访问方法必需对于该新文件是合法的.4FORM= 其中标革默认字符表达式取值为FORMTED或UNFoRMATrED。分别表示文件联结为格式化输入输出或无格式输入输出. 假如该说明符被省略九那么在文件联结为干脆访问时.玳认值为UNFORMAED:而假如文件联结为序列访问时,默认位为FORMATTED. 假如联结文件已经存在,那么该说明符指定的格式必褥对于该文件是合法格式, 般如文件不存在而须要生成新文件.那么说明符指定的格式必需对于该新文件是合法格式.5REC1.=该说明符的取值必需为正整数,在文件联结为干脆访问的状况下,该取的表示文件的好个纪录的长度;在文件岷站为序列访问的状况下,该数值表示文件的全部纪录当中最大的长度. 在文件联结为干脆访问时.该说明符必需给出. 在文件联结为序列访问时,该说明符可以省珞.默认伯依靠于系统的约定. 假如文件联结为格式化输入输出,那么取值为只包含默认字符型字符的纪录的字符数目.假如纪录里面包含了非默认字符型,那么该说明符的取值依篮;于系统的约定. 假如文件联结为无格式输入输出,那么纪录长度由系统约定的度限单位来定具体数值. 假如联结文件己经存在,那么该说明符指定的长度必需对于该文件是合法长度. 假如文件不存在而须要生成新文件.那么说明符指定的长度必需对于该新文件是合法长%6B1.ANK= 其中标汆默认字符表达式的取值为NU1.1.或ZERO, B1.ANK=说明符只能用于格式化输入输出的文件联结。 假如取值为NU1.1.,那么在给定部件的数值格式化坳入城里面的全部空格字符都被忽视,除非全部为空格的域具有零值。 假如取值为ZER0,那么除了头部的空格之外,全部其他空格都被视为0, 假如该说明符省略儿那么数认值为NU1.1.7. POSITION=其中标批默认字符表达式的取值为ASlS.REWIND.或APPEND.该说明符只能用于序列访问的联结。 一个新生成的文件总是定位于初始点. REWlND使得一个已经存在的文件定位于它的初始点. APPEND使得一个已经存在的文件定位于文件终止纪录的前纪录.而锻如该文件不包含文件终止纪录,则定位于该文件的终止点, 假如文件存在并且已经联结,那么ASlS使御它的定位不变.而假如文件存在但没有联结,那么ASIS衣示它的定位未知.假如该说明符被省略.加么默认他为ASIS.8. ACTION= 其中标量默认字符表达式可以取值为READ.WRITE,READWRITE. 取俏READ表示WRITE,PRINT,以及ENDFI1.E语句都不能引用该艇站, 取值WRITE表示READ谱句不能引用该联结. 取值readwrite入示任何输入输Hl语句都可以引用该联结. 假如该说明符省略了,则默认他依毒于系统的约定。 假如文件的合法操作里面包含了READWRITE.那么也应当包含READ和WRITE, 假如联结文件已经存在.那么该说明符指定的操作必需对于该文件是合法操作. 假如文件不存在而须要生成新文件,那么说明符指定的操作必制对于该新文件是合法操作.9. DE1.IM= 该说明符只能用于具有格式化输入输出联结的文件。在输入格式化纪录时该说明符被忽视. 其中标量默认字符非达,。可以取值为APoSTROPHE.QUOTE-NONE.假如取值为ApoSTRoPHE,则表控或名称列表格式写入的字符值的分焦必苛运用做号:而内部领号则必需运用做,3 假如取值为QUOTE,那么表控或名称列表格式写入的字符值的分隔必需运用引号;而内部引号则必需运用双引号. 假如取值为NoNE,那么写入字符不能运用排号或引号作为分隔标记,内部做号或引号也不能是双的, 假如该说明符被省略了,那么帙认取值为NONE,10. PAD-该说明符只能用于具有格式化输入输出联结的文件.在格式化纪录怆出时,该说明符被忽视.其中的标用默认字符表达式可以取值为YES,NO,假如取值为YES,那么在给出了输入列表,并且格式说明要求纪录包含比它原来具有的数据更多的数据时.该格式化愉入纪录可以在尾部添加足峥的空格.假如取值为NO,那么输入列表以及格式说明都不能要求纪录具彳j比它原来具有的数据更多的数据。假如该说明符被省略.那么默认取值为YEJk对于非状认字符型数据.对于附加的空格字符由系蜕约定.16.2.3C1.OSE语句CiQSE语句的功能为终止一个给定部件到一个外部文件的联结.C1.OSE语句的般语法形式(R907)为:C1.OSE(clow-spcc-liM)其中的关闭说明©。scspcc)可以是如下几种形式(R9愉之一:IUNrr=extcm4-Hk*unitIOSTAT=Scalardcfaiilbint-VariublcERR=labelSTATUS=scahr-defaullctarcxrC1.OSE语句的假规则为: 假如在部件说明当中省略了字符UNrr=,那么部件说明符必需是关闭说明列表的第一项. 在一个给定关闭说明里面,任何说明符椰只能出现次.其中必衢给出外部文件部件. 出现在说明符ERR=当中的谱句标签.必需是在和C1.OSE谱句同一个作用域单位里面的分支目标语句的标签. 其中的标最默认字符表达式取值为字符型数据,其尾部的空格都被忽视,假如系统同时支持大小写,那么不区分字符的大小写. 在程序的任何程序单位里面那可以对某个部件执行C1.OSE讲句.但是不能在同一个作用域单位里面和OPEN语句作用于向一个部件. 针对一个不存在的第件.或者是一个没有与文件联结的部件执行C1.OSE语句是合法的,但是不影响任何文件. 在一个作用域单位里面,假如一个部件被C1.OSE语句关闭联结之后,仍旧可以再次和原来的文件,或拧是另外的文件建立联结. 在一个作用域单位里面,假如个命名文件被C1.OSE语句关闭联结,那么它仍旧可以在该程序单位里面和同一个部件,或者另外的部件隹立联结,只要该文件始终存在. 程序的执行正常终止之后.全部的部件联结超被关闭.假如在终止之前文件状态为SeRATCH,那么关闭之后部件状态为DE1.ETE:其他情形下关闭之后的部件状态为KEEPo【例16-3】C1.OSE(10.SIAT1.S=KEEF)C1.OSE语句的STATUS=说明符遵循如下规则: 其中的标盘默认字符表达式可以取假为KEEP.DE1.ETE,分别表示是否保留与给定部件联结的文件. KEEP不能用于在执行C1.OSE语句之前状态为SCRATCH的文件。 假如KEEP用于一个存在的文件,那么在执行C1.OSE语句之后,该文件接着存在. 假如KEEP用于一个不存在的文件,那么在执行C1.OSE谙句之后.该文件仍旧不存在. 假如取值为DE