fortran95的使用方法8.docx
- 文档编号:10784420
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:18
- 大小:24.58KB
fortran95的使用方法8.docx
《fortran95的使用方法8.docx》由会员分享,可在线阅读,更多相关《fortran95的使用方法8.docx(18页珍藏版)》请在冰豆网上搜索。
fortran95的使用方法8
第17章 数据文件的编辑
对于真实世界的任何数据,我们总是要赋予一定的表示形式,以适应人的阅读理解习惯,也就是对于任何数据文件的都存在一个约定的格式,因此当我们使用计算机来输出数据文件时,当然希望直接输出的就是我们所习惯阅读的带有相应格式的数据文件;同样,在我们向计算机输入数据文件时,也希望仍然按照我们习惯的格式约定直接输入到计算机,因此FORTRAN必须提供能够描述数据文件格式的适当的词汇与语句,从而方便人机对话。
实际上只要不是特别小的FORTRAN程序,无论是为了便于程序作者,还是便于其他用户的使用,都必须包含大量的数据输入输出的格式编辑方面的内容,因此掌握好语言的输入输出编辑功能,是编写一个好的FORTRAN程序的非常重要的方面。
对输入输出进行格式控制的基本任务,就是要在数据的机器内部表示与数据的格式化纪录或文件当中的表示之间,进行适当的转化。
当然从编程语言的角度来看,我们并不需要直接地参与这种具体的转化过程,因为数据的机器内部表示是非常依赖于具体的系统的,作为一种通用编程语言,FORTRAN并不需要具有描述具体系统的能力,FORTRAN所需要做的,只需要能够提供描述格式本身的语言就行了,系统如何根据这种描述而进行数据转换,则不需要程序编写者关心。
FORTRAN95对于格式的描述主要就是依靠格式说明符来完成的,此外还可以运用名称列表集合名称来说明名称列表格式。
下面我们分别予以详细讨论。
17.1 显式格式说明
显式的格式说明可以使用如下两种方式:
● 运用FORMAT语句;
● 运用字符表达式。
下面分节讨论这两种显式格式说明方式。
17.1.1 FORMAT语句
FORMAT语句的一般语法形式(R1001)为:
FORMATformat-specification
其中格式说明(format-specification)的一般语法形式(R1002)为:
([format-item-list])
其中的格式项列表(format-item-list)在17.2节专门加以讨论。
FORMAT语句的一般规则如下:
●FORMAT语句必须具有标签。
●在格式项列表当中用于分隔不同格式项的逗号可以在如下几种情形下省略:
•P编辑描述符与后面紧接的F,E,EN,ES,D,或G编辑描述符之间;
•没有给出可选的重复说明时,在斜线编辑描述符之前;
•斜线编辑描述符之后;
•冒号编辑描述符的前后。
●空格字符可以放置在格式说明的初始的左括号之前。
●除了在字符串编辑描述符内部之外,空格可以添加在格式说明的任何位置,不影响对于格式说明的解释。
【例17-1】
5FORMAT(1PE12.4,I10)
9FORMAT(I12,/,'Dates:
',2(2I3,I5))
这是FORMAT语句的两个简单例子。
17.1.2 字符表达式作为格式说明
显式的格式说明除了使用FORMAT语句之外,还可以使用字符表达式,即在格式化输入输出语句里面,字符表达式的字符串取值,作为格式说明符能够有效地说明格式。
注意整个格式说明必须是包含在一对括号当中的。
当格式说明所在的输入输出语句开始执行的时候,格式说明的括号里面的全部字符都必须是已经获得了定义的,而在该语句的整个执行过程当中,其定义都不能被重定义或去定义。
而最右边括号后面的字符则没有任何说明格式的意义。
如果格式说明符引用了一个字符数组,那么该数组的元素按照元素序列联结起来作为一个整体看待。
注意:
如果在输入输出语句里面使用了字符常量来作为格式说明符,那么必须保证该字符常量是有效的格式说明。
参见下面的例子。
【例17-2】
考虑下面的文字:
2ISN'T3
这段文字在输出语句与格式说明当中可以使用如下多种形式:
WRITE(6,100)2,3
100FORMAT(1X,I1,1X,'ISN''T',1X,I1)
WRITE(6,'(1X,I1,1X,''ISN''''T'',1X,I1)')2,3
WRITE(6,'(A)')'2ISN''T3'
注意其中多重的引号与撇号。
17.2 格式项列表的形式
所谓格式项(format-item)的一般语法形式(R1003)是:
[r]data-edit-desc
control-edit-desc
char-string-edit-desc
[r](format-item-list)
其中的r(R1004)为整型字面常量,表示说明重复数。
它必须是正的,并且不能带有种别参数。
其中所谓编辑描述符分为如下三种:
● 数据编辑描述符;
● 控制编辑描述符;
● 字符串编辑描述符。
下面分别给出它们的语法形式。
1.数据编辑描述符的语法形式(R1005)
为以下几种形式之一:
Iw[.m]
Bw[.m]
Ow[.m]
Zw[.m]
Fw.d
Ew.d[Ee]
ENw.d[Ee]
ESw.d[Ee]
Gw.d[Ee]
Lw
A[w]
Dw.d
其中的w(R1006),m(R1007),d(R1008),e(R1009)都是整型字面常量。
而其中的I,B,O,Z,F,E,EN,ES,G,L,A,和D则表示不同的编辑方式。
详细说明参见17.5节。
数据编辑描述符的一般规则如下:
●e必须是正的。
●w在I,B,O,Z,以及F这些编辑描述符里面必须是0或正数。
在其他编辑描述符里面则必须是正的。
●w,m,d,以及e不能带有种别参数。
2.控制编辑描述符的一般语法形式(R1010)
为以下几种:
position-edit-desc
[r]/
:
sign-edit-desc
kP
blank-interp-edit-desc
其中的k(R1011)表示带符号的整型字面常量。
它不能具有种别参数。
而其中的位置编辑描述符(position-edit-desc)的一般语法形式(R1012)为:
Tn
TLn
TRn
nX
其中的n(R1013)为整型字面常量,它必须是正数,并且不能具有种别参数。
符号编辑描述符(sign-edit-desc)的一般语法形式(R1014)为:
S
SP
SS
空格解释编辑描述符的语法形式(R1015)为:
BN
BZ
至于kP里面的k称为比例因子。
控制编辑描述符里面的这些大写字符以及标点符号T,TL,TR,X,斜线,冒号,S,SP,SS,P,BN,以及BZ都表示编辑方式,具体含义参见17-6节。
3.字符串编辑描述符(R1016)
实际上就是一个字符字面常量,而作为字符串编辑描述符的字符字面常量不能带有种别参数。
组成字符串编辑描述符的字符必须属于系统所认可的字符,在字符字面常量中间所出现的分隔符号,即撇号与引号,都必须连续成对出现,不能间隔空格,这样的一对符号应该看成是一个单独的分隔字符。
如果系统同时支持大小写,那么编辑描述符除了对于字符常量之外,不区分大小写。
注意字符串编辑描述符只用于常量数据的输出,而对输入无效。
与数据编辑描述符和字符串编辑描述符相关的一个概念是纪录的域:
当格式控制遇到数据编辑描述符或字符串编辑描述符,读入或写出的部分纪录就称为该纪录的一个域,而域宽即该域的字符数目。
17.3 输入输出的列表与格式的匹配
通过格式说明来进行格式化数据传输的第一步是格式控制,而格式控制的任何操作都依赖于下面的两个方面的信息:
● 格式说明当中的下一个编辑描述符;
● 输入输出列表当中的下一个有效项。
这两个方面的信息都是格式控制所必不可少的,它们之间存在一定的匹配性的要求如下:
● 如果在一个输入输出说明列表当中,至少说明了一个有效的列表项,那么在格式说明里面就至少应该有一个相应的数据编辑描述符,这是输入输出列表与格式说明相匹配的基本条件。
● 只有在输入输出列表里面不存在任何有效列表项的情况下,才可以使用形式为()的空的格式说明。
● 0长度的字符项是一个有效的列表项,但0尺度的数组和具有重复度为0的隐式DO列表不是有效列表项。
● 除了前置有重复说明因子r的格式项之外,格式说明总是解释为从左到右。
● 前置有重复说明因子r的格式项被解释为一个项的列表,数目等于r,每个项都等于原格式项,用逗号分隔。
● 如果重复说明因子r省略了,那么它的默认值为1。
● 对于格式说明里面的每一个数据编辑描述符,都在输入输出列表里面存在一个相应的有效项,当然如果输入输出列表里面的项为复型数据对象,则需要两个F,E,EN,ES,D,或G编辑描述符。
● 对于每个控制编辑描述符或字符编辑描述符,则不存在相应的输入输出列表项。
格式控制直接与纪录进行通讯。
● 只要格式说明里面格式控制遇到数据编辑描述符,那么它就决定了在输入输出列表里面是否存在相应的有效项:
如果存在这样的有效项,那么在该项与纪录之间就传输相应的经过恰当编辑的信息,然后执行相应的格式控制;如果不存在这样的有效项,那么格式控制就终止。
● 如果在格式说明里面,格式控制遇到冒号编辑描述符,而另一个输入输出列表的有效项又没有给出,那么格式控制终止。
● 如果在格式说明里面格式控制遇到一个完整的格式说明的最右边的括号,而另外的输入输出列表的有效项也没有给出,则格式控制终止。
● 如果给出了另外的有效项,则文件定位的方式和处理斜线编辑描述符一样。
格式控制回复到被前置右括号终止的格式项的开头位置;如果不存在这样的前置右括号,那么格式回复到格式说明的第一个左括号处。
一旦出现上述的回复操作,那么格式说明里面重复使用的部分必须至少包含一个数据编辑描述符。
如果格式控制回复到一个前置有重复说明的括号时,其前置重复说明必须同样加以重复使用。
● 格式控制的回复对于比例因子(17.6.5),符号控制编辑描述符(17.6.4)以及空格解释编辑描述符(17.6.6)都不产生任何影响。
【例17-3】格式说明的一个简单例子为:
10FORMAT(1X,2(F10.3,I5))
它的输出列表为:
WRITE(10,10)10.1,3,4.7,1,12.4,5,5.2,6
下面的格式说明能够得到同样的输出:
10FORMAT(1X,F10.3,I5,F10.3,I5/F10.3,I5,F10.3,I5)
17.4 格式控制的文件定位
格式控制的文件定位有如下几种情况:
● 在执行任何的数据编辑描述符或字符串编辑描述符之后,文件都定位于当前纪录的最后一个被读或写的字符之后。
● 在执行T,TL,TR,或X编辑描述符之后,文件的定位约定参见17.6.1节。
● 在执行斜线编辑描述符之后,文件的定位约定参见17.6.2节。
● 如果格式控制出现了上节所述的回复,则文件定位的方式与执行斜线编辑描述符时的方式一样。
● 在进行读的操作时,遇到任何当前纪录的不可处理的字符都被忽略,一直到读入下一个纪录。
17.5 数据编辑描述符
数据的机器内部表示显然是不能直接拿来阅读的,那么数据的输入输出肯定就包含着对于以内部表示存在的数据进行转换的过程。
这就是数据编辑描述符所需要实现的功能。
一个纪录当中的数据对象如果属于数值,逻辑型。
或者默认字符型,那么把它用字符形式表示出来的时候,就必须是采取默认字符;如果数据对象本来就是非默认字符型,那么也必须采用相应的非默认字符型。
在执行字符串编辑描述符的时候,传输到纪录的字符必须是默认字符型。
在执行输入语句的时候,给出的变量同时也就获得了定义,除非中途出现错误条件,或文件终止条件,或纪录终止条件。
在执行输出语句的时候,给出的表达式同时也就被赋予了值。
下面我们分小节讨论下面这三种数据对象的编辑描述符以及一般的编辑描述符:
● 数值编辑描述符;
● 逻辑型编辑描述符;
● 字符型编辑描述符。
17.5.1 数值编辑
用于说明整型,实型,以及复型数据的输入输出格式的编辑描述符包括:
I,B,O,Z,F,E,EN,ES,D,和G。
数值编辑的一般规则如下:
● 对于整型,实型和复型这些数值数据,在输入的时候开头的空格都是没有意义的。
除了开头的空格之外,对于其他位置的空格的解释依赖于以下项目的组合:
·说明符BLANK=;
·预联结文件或内部文件的默认解释;
·对当前部件有效的BN或BZ空格控制。
数值数据之前的加号可以省略。
如果数值数据纪录的每个域只包含空格,则其域宽为0。
● 在输入语句里面使用F,E,EN,ES,D,和G这些编辑符,可以在输入域里面使用比系统所支持的更多的位数。
● 在输出语句里面使用I,F,E,EN,ES,D,G这些编辑符,对于正数或0,和受到编辑描述符S,SP,SS的控制一样,都可以前置加号;而负数则必须前置减号。
● 在输出时,数值表示在域里面是向右看齐的,如果编辑产生的字符数目少于域宽,那么字符串前面用空格填充。
● 在输出时,如果边界产生的字符串的字符数目多于域宽,或者如果指数的长度超过了编辑描述符Ew.dEe,ENw.dEe,ESw.dEe,Gw.dEe所给出的长度,那么系统用星号填充整个宽度为w的域。
● 如果出现了SP编辑描述符,那么加号就不是可选的了。
● 在输出时,如果使用了编辑符I,B,O,Z,F,那么域宽w的值可以是0。
这时系统自动选择保证不会使得整个域填充星号的最小的正数域宽。
● 在输入时,域宽w不能为0。
1.整数编辑
应用于整数的编辑描述符包括:
Iw,Iw.m,Bw,Bw.m,Ow,Ow.m,Zw,以及Zw.m。
其中的各个字符含义如下:
● 其中的I编辑描述符在输入域里面,除了作用于空格之外,表示带符号的数字串(signed-digit-string)(R401);相应的B,O,Z则分别表示二进制,八进制与十六进制数字串(R408,R409,R410)。
如果系统同时支持大小写,那么在十六进制里面的字母的大小写也不予区分。
● 其中的小写字母w表示需要编辑的纪录的域宽,而如果w为0,则由系统约定域宽。
在输入时,域宽w不能为0。
所给出的输入输出列表项必须是整型数据。
● 编辑描述符G也可以用来编辑整型数据,参见17.5.4.1
● m对输入无效。
● Iw编辑描述符给出的输出域由0或可能的空格后接整型数字字符串组成,整型数字字符串可以是负数,则必须前置减号,也可以是正数,则前置可选的加号。
当然都不能前置0。
● 一个数字字符串至少由一个数字组成。
● 编辑描述符Bw,Ow,Zw给出的输出域由0或可能的空格后接二进制,八进制,或十六进制形式的常数数值,同样不能前置0。
● 二进制,八进制,或十六进制形式的常量至少由一个数字组成。
● 除了至少由m个数字组成的数字串之外,编辑描述符Iw.m,Bw.m,Ow.m,Zw.m给出的输出域分别和编辑描述符Iw,Bw,Ow,Zw所给出的一致。
当数字数目不够的情况下,则需要前置足够的0。
● m的值不能超过w的值,除非w为0。
如果m为0,而内部数据值也为0,则输出域完全由空格组成,同时符号控制失去作用。
当m和w同时为0,而内部数据值也为0时,则产生一个空格符。
2.实数和复数的编辑
用于编辑实数和复数的编辑描述符包括:
F,E,EN,ES以及D。
因此凡是和F,E,EN,ES,以及D相应的输入输出列表项都必须是实数或复数。
另外编辑描述符G也可以用于实数和复数数据。
参见17.5.4.1。
下面分小节说明这些编辑描述符的用法。
1.编辑符F
编辑描述符Fw.d表示该域占据w个位置,而它的小数部分由d个数字组成。
如果w的值为0,则由系统约定域宽。
不过在输入的时候,不允许w为0。
使用编辑描述符F的规则如下:
● 输入域包括可选的符号,后接一个或多个可选的数字组成的字符串,其中还包括小数点,以及可以解释为0的空格。
● 如果输入域包含一个小数点,那么d对输入无作用。
● 如果输入域当中没有出现小数点,那么数字串的最右边的d个数字将被认为是所表示的数值的小数部分。
● 数字串所包含的数字字符数目可以超过系统所允许的常量表示的数字的数目,不过这时需要采用如下的三种形式的指数形式:
·符号后接一个数字串;
·E后接0和多个空格,然后再后接一个具有符号的数字串;
·D后接0和多个空格,然后再后接一个具有符号的数字串。
包含D的指数等同于包含E的指数。
● 如果输入域不包含一个指数,则等价于在基本形式后接一个指数值-k,这里的k为给定的比例因子。
● 输出域包含空格,依据数值正负而定的必须的减号,和可选的加号,然后就是带有小数点的数字串,表示了内部值的大小。
·当输出域里面的值的小于1时,除了紧接小数点左边的可选的0之外,不允许前置0。
·当除了这个0自身之外,输出域里面不再含有其他数字,那么这个可选的0就必须出现。
2.编辑符E和D
编辑描述符Ew.d,Dw.d,以及Ew.dEe表示外部域占据w个位置,而它的小数部分由d个数字组成(除非出现一个大于1的比例因子),指数部分由e个数字组成。
其中e的取值对于输入没有作用。
如果输入域包含小数点,则d也对输入没有作用。
输入域的形式和说明和F编辑符一致。
比例因子为0的输出域形式为:
][0].x [1x2xdexp
其中为加号或减号。
注意如果|exp|>999,则编辑描述符Ew.d和Dw.d都不能使用。
3.编辑符EN
编辑描述符EN表示输出域的形式为实数的在工程技术领域常常使用的一种表示形式,即如下形式的实数:
]yyy.x [1x2xdexp
显然这种形式的实数除非输出值为0,它的整数部分的绝对值都是大于等于1而小于1000的。
具体的编辑描述符包括ENw.d和ENw.dEe,表示外部域占据了w个位置,分数部分由d个数字组成,而指数部分由e个数字组成。
这时输入域的形式和解释和编辑符F的一致。
如果|exp|>999,那么编辑符ENw.d就不能使用了。
【例17-4】
内部值 使用了编辑符SS,EN12.3的输出域
6.421 6.421E+00
–.5 –500.000E–03
03.00217 2.170E
4721.3 4.721E+03
4.编辑符ES
编辑描述符ES产生的输出域的形式为实数的科学表示法。
这种形式的实数的整数部分在不等于0的情况下,大于等于1而小于10。
比例因子对输出无作用。
这种表示形式为:
]y.x [1x2xdexp
具体的编辑描述符包括ESw.d和ESw.dEe,表示外部域占据w个位置,小数部分由d个数字组成,而指数部分由e个数字组成。
输入域的形式和解释同编辑符F的一致。
如果|exp|>999,那么不能使用编辑符ESw.d。
【例17-5】
内部值 使用了编辑符SS,ES12.3的输出域
6.421 6.421E+00
–.5 –5.000E–01
.00217 2.170E-03
4721.3 4.721E+03
5.复数编辑
由于在FORTRAN里面复数本质上被看成是两个实数组成的数组,因此复数的编辑实际上就是分别对组成复数的两个实数的编辑,即第一个编辑描述符用于复数的实部,而第二个编辑描述符用于复数的虚部,这两个编辑描述符可以不同。
而在这两个编辑描述符之间,还可以使用控制编辑符和字符串编辑符。
17.5.2 逻辑型编辑
逻辑型编辑描述符Lw表示域宽为w,而相应的输入输出列表项当然必须为逻辑型数据。
编辑描述符G也可以用来编辑逻辑型数据。
参见17.5.4。
输入域可以包括可选的空格,可选的小数点,然后是T或F,分别表示真和假。
在T或F后面还可以附加任意的字符,但是系统都一律予以忽略。
如果系统同时支持大小写,那么在逻辑型输出域里面大小写是等价的。
逻辑常量.TRUE.和.FALSE都是合法的输入形式。
输出域由w-1个空格,后接T或F组成,分别表示真或假。
17.5.3字符型编辑
顾名思义,字符型编辑描述符A[w]只能应用于字符型的输入输出列表项,而同时编辑符G也可以用于字符型数据。
在编辑符A或G的控制下,字符型数据在传输和转换时所涉及到的种别参数的匹配问题,是由相应的列表项的种别参数来决定的。
如果编辑符A给出了域宽w,那么该域就由w个字符组成;如果编辑符A没有给出域宽w,那么域里面的字符的数目就是相应列表项的字符长度,而不用考虑种别参数值。
设一个输入输出列表项的长度为LEN,如果相应输入域宽已经由编辑符A给出为w,那么当w大于或等于LEN时,那么取右边的LEN个字符作为输入;如果w小于LEN,那么这w个字符靠左边对齐,而尾部填充LEN-w个空格作为输入。
如果编辑符A给出的输出域宽w大于LEN,那么输出域由w-LEN个空格后接LEN个字符组成;如果w小于或等于LEN,那么输出域由靠左边的w个字符组成。
17.5.4通用编辑
编辑描述符Gw.d和Gw.dEe用于任意固有类型的输入输出列表项,因此称为通用编辑符。
一般的应用这种编辑符时,总是表示域宽为w,小数部分至多为d个数字,而指数部分为e个数字。
当然当该编辑符应用于整型,逻辑型以及字符型数据时,d和e这两个参数都失去意义。
1.通用数值编辑
当应用编辑描述符Gw.d和Gw.dEe来说明整型实型以及复型数据时,遵循数值编辑的一般的规则。
参见17.5.1。
其中的编辑符Gw.dEe的应用规则和编辑描述符Ew.dEe的规则一致。
●通用整数编辑
当针对整型数据的输入输出应用编辑描述符Gw.d和Gw.dEe时,规则和应用编辑描述符Iw一致,只是这时w不能为0。
●通用实数和复数编辑
这时输入域的形式与解释和编辑符F的一致。
而输出域的表示形式依赖于需要进行编辑的数值的大小。
比例因子同样是无效的,除非数值超出了F编辑所允许的有效范围。
2.通用逻辑型编辑
当应用Gw.d和Gw.dEe来编辑逻辑型数据的输入输出时,遵循编辑描述符Lw的规则。
3.通用字符型编辑
当应用Gw.d和Gw.dEe来编辑逻辑型数据的输入输出时,遵循编辑描述符Aw的规则。
17.6 控制编辑描述符
控制编辑描述符并不决定数据的传输以及数据的内部表示和外部表示之间的转换,但是这种编辑符能够对后续的数据编辑描述符所执行的转换产生特定的影响。
下面分节说明FORTRAN的这些控制编辑描述符。
17.6.1定位编辑
所谓定位编辑描述符T,TL,TR,以及X的功能就是给出开始从纪录进行传输,或者传输到纪录的第一个字符的位置。
由编辑描述符T给出的定位可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- fortran95 使用方法