fortran95的使用方法7文档格式.docx

上传人:b****4 文档编号:16444819 上传时间:2022-11-23 格式:DOCX 页数:28 大小:33.65KB
下载 相关 举报
fortran95的使用方法7文档格式.docx_第1页
第1页 / 共28页
fortran95的使用方法7文档格式.docx_第2页
第2页 / 共28页
fortran95的使用方法7文档格式.docx_第3页
第3页 / 共28页
fortran95的使用方法7文档格式.docx_第4页
第4页 / 共28页
fortran95的使用方法7文档格式.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

fortran95的使用方法7文档格式.docx

《fortran95的使用方法7文档格式.docx》由会员分享,可在线阅读,更多相关《fortran95的使用方法7文档格式.docx(28页珍藏版)》请在冰豆网上搜索。

fortran95的使用方法7文档格式.docx

16.1 

输入输出管理的数据单位

FORTRAN对于输入输出数据进行管理的基本单位概念是纪录以及纪录组成的文件,因此下面我们分别讨论纪录与文件概念。

16.1.1 

纪录

FORTRAN的变量一次只能存储一个数据值,显然不足以用来进行有效的数据管理,因此FORTRAN建立了专门的用来有组织地存储任意数量的数据的概念,即文件。

文件由一个纪录的序列组成,而纪录是一种逻辑形式上的单位,可以是终端或打印输出上显示的一行,也可以是外部存储器上的一个逻辑纪录,尽管纪录总是与各种物理形式的数据单位保持一定的对应,但实际上是与具体的物理表现形式无关的,因为纪录本质上是一个语法上的概念。

实际上在FORTRAN里面并不存在物理纪录的概念。

组成一个文件的纪录从语法地位上分为如下两种:

数据纪录;

文件终止纪录。

所谓数据纪录就是作为文件的数据内容的纪录,而文件终止纪录则纯粹是一个语法意义上的纪录,它不包含任何数据内容,只是用来标志一个文件的终止。

因此文件终止纪录只能用作文件的最后一个纪录,并且没有长度的属性。

由于计算机本质上的串行工作模式,纪录同样是一个串行序列的结构,该序列的单位就是数据值,即一个数据值的序列组成一个纪录。

对于数据纪录来说,其中的数据值可以有如下两种表示形式:

无格式数据;

格式化数据。

所谓数据的是否具有格式,完全是针对人而言的,即具有格式的数据就是把数据转化为便于人的阅读的字符型数据表示形式,也就是文字与数字,或者说ASCII编码形式;

而所谓无格式数据就是FORTRAN程序自身所实际处理的数据的在物理层面上的表示形式,一般都是二进制表示的数字形式。

对于计算机来说,世界上的任何形式的信息,终归都要表示为这种形式的数据。

一个FORTRAN程序所涉及到的任何数据,在该程序运行时,无论是作为运行的结果还是作为运行的初始值,它写入到内存当中,或从内存当中读出,或者是从内存到硬盘的输入输出,数据流里面的数据都是无格式数据。

而一旦数据需要人的阅读,就必须把二进制数据形式转换为能够被人阅读的字符形式,实际上我们编写的源码就是这种形式的数据。

一个数据纪录或者完全由无格式的数据组成,称为无格式纪录;

或者完全由格式化数据组成,称为格式化纪录。

无格式纪录完全只是在机器内部存在,它的具体的数据形式是由系统决定的,最常见的就是二进制形式。

这种纪录完全不需要人的监视与阅读,而格式化纪录则完全是人用来给机器输入数据,或机器向人展示数据结果的数据纪录形式,因此当人向机器输入格式化纪录后,机器必须再把它翻译为无格式的纪录,才能被程序所使用,反之亦然。

格式化纪录的好处就是便于人的阅读,它只能通过格式化输入输出语句来读或写;

而无格式的纪录的特点就是能够直接得到机器的处理,相应的它也只能通过无格式的输入输出语句来读或写。

对于纪录可以定义长度的概念。

格式化纪录的长度就是其所包含的字符的数目;

而无格式纪录的长度同样用来计量其中数据量的大小,它的具体度量方法的定义则依赖于具体的处理器系统对于数据量单位的定义。

格式化纪录和无格式纪录的长度都可以为0。

除了包含数据值的纪录之外,还有文件终止纪录。

由于它只是起文件终止的语法标志作用,因此它不包含任何数据,所以它的长度也就是0。

一个文件至多只能包含一个文件终止纪录,并且只能是文件的最后一个纪录。

文件终止纪录可以有如下几种生成方式:

可以通过文件的序列访问,最后用一个ENDFILE语句显式地写下来;

也可以通过文件定位语句,如REWIND语句或BACKSPACE语句,而隐式地写下来;

运用CLOSE语句关闭文件或部件,或者是正常地终止程序,或者是对同一个部件使用了另外一个OPEN语句,从而隐式地写下来。

从上面的文件终止纪录的实现方式可以看出,这种纪录并不需要任何实际的物理实现。

16.1.2 

文件

一个纪录的序列构成一个文件。

在程序运行的任何时候,对于一个给定的文件,它的访问方法,形式,操作以及纪录的长度,都明确地存在相应的依赖于系统的合法性规定,同时文件也可以具有字符串类型的名称,即所谓命名文件,不过对于该名称所使用的字符形式或长度,都是由具体的系统来规定,以便与相应操作系统对于文件的命名约定保持一致。

按照文件与程序的功能关系以及存储性质,文件可以分为如下两种:

内部文件;

外部文件。

所谓内部文件存储在程序可以访问的内存空间里面,而外部文件则存储在系统的外部存储部件上,例如硬盘。

这种存储位置的不同实际上也反映了它们对于程序的不同功能,因为这两种存储空间的物理性能差异决定了它们对于CPU是具有不同意义的。

外部文件与内部文件的这种不同功能意义体现在如下几个不同的方面:

文件的存在性。

对于外部文件来说,程序需要访问的一个外部文件可能是存在的,也可能是不存在的,都是合法的程序运行现象。

例如INQUIRE语句,OPEN语句,CLOSE语句,WRITE语句,PRINT语句,REWIND语句,以及ENDFILE语句都可以引用一个并不存在的文件;

而如果使用WRITE语句,PRINT语句,或ENDFILE语句来引用一个预联结的并不存在的语句,就自然地能够生成该文件。

一个外部文件的不存在也可能是来源于系统对于硬盘空间的权限限制,例如对于一个

FORTRAN应用程序来说,系统文件以及FORTRAN编译器程序文件都不应该被访问。

而对于程序来说,它所涉及的内部文件则都必须存在于相应的内存空间里面。

程序对外部文件的访问需要通过与逻辑部件建立联结,因此就需要相应的能够对外部文件进行联结,定位与查询的语句,而对于内部文件则不需要这些语句功能。

同时这种联结就使得外部文件具有定位的属性。

对于外部文件来说,它的访问方式,合法形式,合法操作,以及合法纪录长度等都不是由FORTRAN语言标准来规定,而是由操作系统对于文件的约定以及用户的特定选择来决定的;

而内部文件的内容都是作为默认字符型变量的数据值的形式而储存的,这些字符型数据值都是程序的通常的赋值过程所产生的,或者是输出语句针对变量而给出的。

如果内部文件所表示的变量是一个标量,那么该文件就只有一个纪录;

如果该变量是一个数组,那么该数组的每一个元素组成该文件的一个纪录,文件里面纪录的顺序就是数组的相应的元素顺序,每个纪录的长度就是相应元素的长度。

16.1.3 

文件的访问

由于文件的纪录是一种串行的序列结构,要实现对文件的纪录的访问,可以有如下两种方式:

序列访问;

直接访问。

所谓序列访问,就是顺着文件的纪录序列来访问特定的纪录,即如果要访问文件的第n个纪录,则需要顺次经过文件的第1,…,一直到第n-1个纪录,才访问到第n个纪录;

而直接访问则不需要经过前面的n-1个纪录,通过指定纪录号即可直接访问第n个纪录,因此直接访问无论是读还是写,都可以按照任意的顺序进行。

这两种不同的访问方法很大程度上是由存储文件的媒质以及系统的约定等外部因素决定的,例如存储在磁带上面的可能就只允许采用序列访问的方式进行访问。

不过当一个文件被联结到了一个特定的部件之后,或者是预联结的文件被生成之后,它的访问方式就已经被决定了。

这两种不同的访问方式是由对文件的联结方式决定的,而不是属于文件自身的属性。

一个文件可以只能通过序列访问方式来访问,也可以只能通过直接访问方式来访问,也可以分别通过这两种方式来访问,但不能同时用这两种方式来访问,也就是说当文件通过某个联结而被程序按照序列方式来访问,那么需要使用CLOSE语句来关闭该联结之后,再使用OPEN语句重新建立新的联结,才能换为按照直接访问的方式来访问。

能够直接访问读的纪录只限于已经写下来的纪录。

能够直接访问写的文件限于建立了直接访问联结的文件。

1.序列访问

一个外部文件建立了序列访问的联结之后,它就具有如下的属性:

如果针对该文件的直接访问是非法的,那么组成该文件的纪录的顺序就是写入该文件的纪录顺序;

如果同时针对该文件的直接访问也是合法的,那么该文件的纪录的顺序由直接访问来决定,即序列访问该文件的第一个纪录就是直接访问该文件所指定的纪录号为1的纪录,后面顺次类推。

文件的纪录或者全部是格式化纪录,或者全部是无格式纪录,当然有可能出现在文件最后的文件终止纪录除外。

只要该文件的前一个引用不是数据传输输出语句或文件定位语句,那么文件的最后一个纪录就一定是文件终止纪录。

文件的纪录不允许直接访问输入输出语句的读与写。

2.直接访问

如果一个外部文件所建立的联结是直接访问,那么该文件具有如下属性:

文件的所有纪录都具有一个唯一的纪录号,该纪录号为一个正整数,是在写纪录时给定的,而这个纪录号一旦给定,就再也不能改变。

该纪录号决定了文件的纪录的顺序。

文件的任何纪录不允许被删除,但允许被改写。

文件的纪录或者全部是格式化纪录,或者全部是无格式纪录。

如果对于该文件序列访问方式也是合法的,那么当该文件被联结到直接访问时,它有可能包含的文件终止纪录则不被认为是属于该文件的一部分。

如果对于该文件不允许序列访问,那么该文件就不能包含文件终止纪录。

只有通过直接访问输入输出语句才能实现对纪录的读和写。

文件所有的纪录的长度相同。

对于一个文件的纪录的读写顺序不一定要求按照纪录号的顺序。

一旦文件与部件建立了联结,那么对于该文件的纪录的读写可以是任意顺序的。

文件的纪录不能使用表控格式,名称列表格式,或通过非预输入输出语句来读写。

16.1.4 

文件的定位

由于文件是一个数据的集合,因此程序在运行过程当中,对于文件的读写操作总是意味着程序当前所使用的数据是在发生变化的,为了描述程序当前所使用的数据或纪录,FORTRAN定义了文件的位置的概念,并且还给出了专门用来对文件位置进行操作的语句,以便实现对文件所包含的数据的精确访问与操作。

针对文件所包含的纪录的串行序列结构,以及纪录本身所包含的数据值的串行序列结构,FORTRAN定义了如下几个特征性的文件的定位情形:

初始点。

即文件第一个纪录前面紧接该纪录的位置。

如果文件定位在这个位置,那么程序对于该文件的操作将从文件的第一个纪录开始。

终止点。

即文件最后一个纪录后面紧接该纪录的位置。

如果文件定位在这个位置,那么程序接下来的操作将不进入该文件。

如果文件为空文件,即不包含任何数据,那么它的初始点和终止点相同

对于文件的定位可以处于两个紧接的纪录中间,这时位于该位置的前面的那个纪录称为前纪录,而位于该位置的后面的那个纪录称为后纪录。

当然对于初始点不存在前纪录,而对于终止点则不存在后纪录。

对于文件的定位也可以是在输入输出语句运行时的当前纪录上面,这时该当前纪录的紧接的前面的那个纪录称为其前纪录,而该当前纪录的紧接的后面的那个纪录称为其后纪录。

当然,如果文件定位不是在一个纪录里面,那么当前纪录就不存在。

当文件定位处于当前文件时,还可以更加详细地描述为定位于当前纪录的数据值序列的初始点或终止点,或纪录的任意两个数据值之间。

即该纪录的紧接在数据值序列的第一个数据值前面的位置,或紧接在数据值序列的最后一个数据值后面的位置,或在数据值序列里面的任意两个数据值之间的位置。

内部文件总是在数据传输之前定位在纪录的开始位置。

预输入输出操作总是以纪录为单位的,因此完成这样一个操作之后,文件总是定位于一个纪录的终止位置或纪录之间的位置;

而非预输入输出操作是以字符为单位的,因此完成一个非预输入输出操作之后,文件有可能定位于当前纪录的字符序列之间。

输入输出语句的运行总能影响外部文件的定位,根据作用效果的不同,输入输出语句可以分为如下两种:

预输入输出语句。

一个预输入输出语句总是在文件的最后一个纪录完成读写之后对文件定位,除非中途发生错误。

非预输入输出语句。

一个非预输入输出语句可以定位于当前纪录里面的字符位置,或者是随后的纪录上面。

运用非预输入输出语句就可以通过一个输入输出语句序列读写文件的纪录,其中每个语句访问纪录的一部分。

这种语句也可以用来读可变长度的纪录。

在数据传输之前的文件的定位在直接访问文件与序列访问文件时有不同的约定:

序列输入时,如果存在当前纪录,那么文件定位不变;

否则文件定位于下一个纪录的头部,自然该纪录就成为了当前纪录。

如果这个纪录不存在,或者在存在当前纪录,而最近访问文件的数据传输语句执行的是输出,那么该输入就不执行。

如果文件包含文件终止纪录,那么在数据传输之前文件不能定位于文件终止纪录后面。

可以运用REWIND语句和BACKSPACE语句来对文件重定位。

序列输出时,如果存在当前纪录,那么文件定位不会变化,当前纪录成为文件的最后纪录;

如果不存在当前纪录,那么就生成下一个纪录作为文件的当前纪录,文件定位于该当前纪录的头部。

如果是直接访问,文件的定位情形非常简单,即定位于纪录说明符所指定的纪录的头部。

该纪录就是文件的当前纪录。

在数据传输过程结束之后,文件的定位有如下几种情形:

如果数据传输过程了发生错误,那么文件定位就是不可预知的。

如果数据传输过程没有发生错误,但是读入了文件终止纪录而导致文件终止,那么文件定位于文件终止纪录之后。

对于非预输入如果没有出现错误,也没有出现文件终止条件,但是出现了纪录终止条件,那么文件定位于刚读入的纪录之后;

如果纪录终止条件也没有出现,那么文件定位不变。

对于非预输出如果没有出现错误,则文件定位不变。

在所有的其他情况下,文件定位于刚读写过的纪录之后,该纪录就成为了前纪录。

16.1.5 

内部文件

内部文件的概念是FORTRAN语言的一个很大的特点,它实现了数据从内存到内存的传输与转换的功能。

内部文件的属性与约定如下:

内部文件为默认字符型变量,不能是带向量下标的数组片断。

内部文件的纪录为标量字符变量。

如果文件本身就是一个标量字符变量,那么该文件就只包含一个纪录,其长度就是标量字符变量的长度。

如果内部文件是一个字符数组,那么它就被看成是一个字符数组元素的序列,其中的每个元素都是该文件的一个纪录,该文件纪录的顺序就是该数组或数组片断的数组元素序,该文件的每个纪录的长度都相同,即数组元素的长度。

写入内部文件纪录的同时就定义了该纪录。

如果写入字符数目少于纪录长度,那么纪录多余的空间就被填上空字符。

写入的字符数目不能超过纪录长度。

只有在内部文件的纪录被定义之后,才能读入该纪录。

内部文件的纪录除了通过输入语句之外,还可以使用其他方法得到定义或去定义,例如字符赋值语句也能够定义作为纪录的字符变量。

在数据传输之前,内部文件总是定位于第一个纪录的头部,而该纪录就是当前纪录。

在输入内部文件时,对空格的处理与使用具有值NULL的说明符BLANK=来打开外部文件一样,在必要的时候纪录可以添加空格。

在表控输出时,字符常量不能定界。

内部文件纪录的读与写只能通过不说明名称列表格式的序列访问格式化输入输出语句来完成。

内部文件不能出现在文件联结语句,文件定位语句以及文件查询语句当中。

16.2 

文件的部件联结与访问

程序要和文件进行通讯,都需要程序通过一定的部件联结到文件,即通过部件输出数据到文件,通过部件从文件输入数据到程序。

这里的所谓部件是一个纯粹的逻辑概念,而不是一个物理概念,之所以要引入这么一个逻辑概念,主要的原因就是为了在语言里获得对输入输出的通用描述。

因为我们知道文件概念实际上是与操作系统与硬件存储形式密切相关的,不同的操作系统与硬件存储形式里面,对于文件往往有不同的形式约定,因此为了使得对输入输出能够有不依赖于具体系统的描述,FORTRAN引入了部件这个逻辑概念作为数据从程序到文件之间的桥梁。

部件使用如下的语法表示方法(R901):

io-unit

其中的输入输出部件(io-unit)可以具有如下三种形式之一:

external-file-unit

*

internal-file-unit

其中外部文件部件的表示形式为标量整型表达式或者是一个星号,而内部文件部件的表示形式为默认字符型变量。

部件的一般规则如下:

●表示内部文件部件的默认字符型变量不能是带有向量下标的数组片断。

●一个部件可以作为外部部件也可以作为内部部件。

外部部件用来联结外部文件;

而内部部件用来联结内部文件。

●如果表示内部文件部件的字符型变量是指针,那么该指针必须是获得了关联的。

●如果表示内部文件部件的字符型变量是一个可分配数组,或者这样一个数组的子对象,那么该数组必须是当前可分配的。

●表示外部文件部件的标量整型表达式必须是0或正整数。

●出现在文件联结语句,文件定位语句,以及文件查询语句当中的输入输出部件只能表示外部文件部件。

●在一个程序的所有程序单位里面,一个表示外部文件部件的标量整型表达式的值,表示同一个外部部件。

●星号表示预先联结用来进行格式化序列访问的特定的与系统相关的外部部件。

●对于一个给定程序,在任意的时间总是存在一个与系统相关的外部部件集合。

所有的输入输出语句都可以使用存在的部件,而INQUIRE语句和CLOSE语句还可以使用不存在的部件。

【例16-1】

SUBROUTINEA

READ(6)X

...

SUBROUTINEB

N=6

REWINDN

在这个程序例子里面,两个不同的程序单位里面出现的外部部件名称6表示同一个外部部件。

16.2.1 

文件到部件的联结与预联结

一个外部部件可以被联结,也可以不被联结,这两种状态都是合法的。

外部部件通过预联结或通过使用OPEN语句而获得与一个外部文件的联结,正是这种联结使得外部文件能够被程序访问。

这种访问也就是输入输出语句的功能所在,或者准确地说是除了OPEN语句,CLOSE语句,以及INQUIRE语句之外的所有输入输出语句因此而能够通过外部部件而访问相应的外部文件或对相应的外部文件进行操作。

文件到部件的联结与预联结的一般规则如下:

●一个文件可以与部件建立联结但本身却还不存在,例如一个已经建立了预联结的文件,但可能还没有被写入。

●一个部件在同一个时间不能联结多于一个文件;

而一个文件也不能在同一个时间与多于一个的部件相联结。

●执行CLOSE语句之后,相关的外部部件就失去了联结,然后在同一个程序单位里面,该部件仍然可以根据程序的需要再次与同一个文件或不同的文件建立联结。

类似的,执行CLOSE语句之后,相关的外部文件也失去了联结,然后在同一个程序单位里面,该文件仍然可以根据程序的需要而再次与同一个部件或不同的设备建立联结。

●一旦一个文件失去了联结,那么再次引用该文件的唯一方法就是在OPEN语句或INQUIRE语句里面引用该文件的名称,而如果失去联结的文件没有名称,那么就无法使得它再次获得联结。

●对于内部部件来说,总联结到由标志该部件的默认字符型变量所给出的内部文件。

●一旦部件与文件建立了联结,那么也就意味着建立了访问的方法,或者是序列访问,或者是直接访问。

●一旦与一个已经存在的文件,或者是通过联结而生成的新文件建立联结,那么就会建立相应的格式化或非格式的数据格式。

如果联结是通过执行OPEN语句而建立的,那么在没有指定数据格式的情形下给出默认数据格式;

如果联结为预联结到一个已经存在的文件,那么数据格式由预联结建立;

如果预联结到一个不存在的文件,那么数据格式可以建立,也可以推迟到文件生成之后再建立,例如运行格式化或非格式的WRITE语句之后。

16.2.2 

OPEN语句

OPEN语句的功能就是建立初始的外部文件与指定部件之间的联结,或者是修改该联结。

具体地说,一个OPEN语句可以产生如下几种作用:

联结一个已经存在的文件到部件;

产生一个已经预联结的文件;

产生一个新的文件然后把它联结到指定部件;

改变一个文件与部件之间联结的特定说明符。

OPEN语句的语法形式(R904)为:

OPEN(connect-spec-list)

其中的联结说明(connect-spec)的语法形式(R905)有以下几种:

[UNIT=]external-file-unit

IOSTAT=scalar-default-int-variable

ERR=label

FILE=file-name-expr

STATUS=scalar-default-char-expr

ACCESS=scalar-default-char-expr

FORM=scalar-defa

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

当前位置:首页 > PPT模板 > 动态背景

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1