Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1798133
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: C/C++

2012-03-26 13:59:47

文件分为外部文件内部文件。外部文件包括外部设备(如键盘和屏幕)以及磁盘上的文件,而内部文件指在内存中可以像磁盘文件一样进行操作的数据块。

为了对文件进行操作,需要使用逻辑设备与它们连接。外部文件可以通过open(unit=id,file='filename')的方式打开,id便是逻辑设备的标识符,可以用来读写,也能用close关闭文件。设备号的取值范围为-3276832767
Fortran预定义了4种外部文件(设备):

设备号

连接的设备

星号(*)

总是键盘和显示器

0

缺省状态下是键盘和显示器

5

缺省状态下是键盘

6

缺省状态下是显示器

此前所有的print *, ...语句就是表示向显示器输出。*设备不能被关闭。

内部文件对应的逻辑设备可以用一个变量名来表示:


  1.       subroutine test_internal_unit
  2.       character(14) str
  3.       write (str, '(All)'), 1
  4.       read (str, '(All)'), n
  5.       print *, n
  6.       end


外部文件的访问方式有两种:顺序访问和直接访问;而文件结构有三种:格式化文件、无格式文件和二进制文件。这样组合出来的文件有六种。

1、格式化顺序文件
以可读的字符串形式进行(顺序)读写。文件打开时在文件开头写入(文件原有数据会被清空),之后每次在文件末尾处写入一条记录。所有记录的大小不定,且由回车符加换行符(即\r\n)分隔。下面是一个例子:


  1.       subroutine test_seq_formatted_file
  2.       open (3, file='myfile') ! 默认情况下文件打开方式为顺序访问格式化文件
  3.       write (3, '(All)'), "43" ! '(All)'为一种格式,读写格式化文件时必需。数字以可读的字符串形式写入。
  4.       write (3, '(All)'), "again" ! 每次写一条记录会自动添加\r\n以示记录结束
  5.       close (3)
  6.       end


2、格式化直接文件
所有的记录同样用\r\n分隔,但所有记录的大小一样,而且在打开文件时需要指定每个记录的大小(字节数):
  1.       subroutine test_dir_formatted_file
  2.       open (4,file='mydirfile',form='formatted',access='direct',recl=10)!recl=10表示每条记录的长度是10个字节,所有记录用\r\n隔开
  3.       write (4, '(All)', rec=3), 65 !在第三个记录里写入65(以字节形式)
  4.       write (4, '(All)', rec=5), 'hello'
  5.       close (4)
  6.       open (4,file="mydirfile",form='formatted',access='direct',recl=10)
  7.       read (4, '(All)', rec=3), iValue
  8.       print *, iValue ! 65
  9.       close (4)
  10.       end


3、无格式顺序文件
记录不再用\r\n分隔,而且每个记录的大小也可以不同。文件内容的排序方式为:记录1大小(字节数) + 记录1 + 记录1大小 + 记录2大小 + 记录2 + 记录2大小+记录3大小+记录3 + 记录1大小……每个记录的前后分别用1个字节来表示该记录的大小。下面是个例子:
  1.       subroutine test_seq_unformatted_file
  2.       integer, dimension(20):: array, array2
  3.       real :: r1, r2
  4.       array = (/(i,i=1,20)/)
  5.       r1 = 4.5
  6.       open (8, file='uf-seq', form='unformatted')
  7.       write (8), array
  8.       write (8), r1
  9.       close (8)
  10.       open (8, file='uf-seq', form='unformatted')
  11.       read (8), array2
  12.       read (8), r2
  13.       close (8)
  14.       print *, array2, r2
  15.       end


4、无格式直接文件
记录不用任何特殊方式分隔。每个记录包含相同的字节数:
  1.       subroutine test_dir_unformatted_file
  2.       integer(4) :: i=5, j=0
  3.       open (9, file='uf-dir', form='unformatted',access='direct',recl=4)
  4.       write (9, rec=3), i
  5.       write (9, rec=10), 10
  6.       read (9, rec=3), j
  7.       close (9)
  8.       print *, j ! 5
  9.       end


5、二进制顺序文件
数据就是以字节序列的方式存放在文件中,没有添加任何表示文件结构的特殊字节。这种文件的打开方式为form='binary'。(我的gfortran不支持这种形式的文件……)

6、二进制直接文件
与无格式直接文件类似,所有记录的大小一样,其大小由open函数的recl参数指定。记录中未被使用的部分由未定义的字节填充。


下面贴出四类文件操作语句

a)   OPEN语句
OPEN语句用于把设备号与文件名连接起来,并且对文件的各项性质进行指定。它的一般形式为:


        OPEN([UNIT=]unit[,ACCESS=access][,ACTION=action][,BLANK=blanks][,BLOCKSIZE=blocksize][,CARRIAGECONTROL=carriagecontrol][,DELIM=delim][,ERR=err][,FILE=file][,FORM=form][,IOFOCUS=iofocus][,IOSTAT=iostat][,PAD=pad][,POSITION=position][,RECL=recl][,SHARE=share][,STATUS=status])


其中的各项参数的意义及取值如下:


  1) UNIT:设备号说明。unit是大于或等于0的正整数,设备号说明是OPEN语句的第—项时可以省略“UNIT=”。

  2) ACCESS:存取方式说明。access是字符串表达式:
        APPEND     追加方式
        SEQUENTIAL 顺序访问方式
        DIRECT     直接访问方式
  当省略此说明项时为顺序访问方式。

  3) ACTION:描述文件的读写属性。action是字符串表达式:
        READ       文件为只读方式打开
        WRITE      文件为只写方式打开
        READWRITE  文件为可读写方式打开
  当省略此说明项时,文件打开顺序:READWRITE->READ->WRITE。

  4) BLANK:说明数据格式输入字段中空格的含义。blank是字符串表达式:
        NULL       空格忽略不计,相当于在格式描述符中的BN编辑符
        ZERO       空格处理成数字0,相当于BZ编辑符
  当省略此说明项时为ZERO。此说明只能用于格式输入。

  5) BLOCKSIZE:指定以字节为单位的设备缓存的大小,默认值为一4字节整数。

  6) CARRIAGECONTROL:指明处理文件中的第一个字符的方式,其值为字符串表达式:
        Fortran    对第一个字符作一般的Fortran解释
        LIST       指出在文件的每两个记录之间有—个空格
  默认状态下,对于连接到打印机和显示器这样的设备,设置值为Fortran,对于连接到文件的设备,设置值为LIST。当FORM被设成UNFORMATTED和BINARY时,其值被忽略。

  7) DELIM:指明分隔直接列表或格式化名称列表记录的方式,其值为字符串表达式:
        APOSTROPHE 用单撇号(’)分隔
        QUOTE      用双撇号(”)分隔
        NONE       不用分隔符
  如果在OPEN语句中设置了分隔符,则在文件中的单撇号和双撇号都是成对出现的。

  8) ERR:出错处理说明。其值是同一程序中的一条语句的标号,当OPEN语句执行出错时执行此语句。如果省略该项,则出错时给出出错信息并终止运行。

  9) FILE:文件名。file是一字符串表达式,可以是空、合法的数据文件名字、设备名字或是作为内部文件 的变量。在WinNT/9x中允许使用长度大于8的文件名和长度大于3的文件扩展名。省略此项时,编译器将自动产生一个文件名唯一的临时文件,这个临时文 件将在结束运行或与文件连接的设备关闭后被删除掉。

  10) FORM:记录格式说明。form是字符串表达式:
        FORMATTED    记录按有格式存放。
        UNFORMATTED  记录按无格式存放。
  当省略此说明项时为:对顺序文件是有格式的;对直接文件是无格式的。

  11) IOFUS:指出一个新Quickwin子窗口是否为活动窗口,其值为逻辑值。缺省值为真。

  12) IOSTAT:出错状态说明。iostat是—个缺省长度为4的整形变量。当执行此OPEN语句时系统给变量赋值:
        零         没有发生错误
        负数       文件结尾
        正数       发生错误,其值视具体计算机系统而定
  若省略该项则没有此功能。

  13) PAD:从格式化文件中记录的数据少于要读取的数据时,是否用空格来填充没有从记录中读到数据的变量。pad是字符串表达式:
        YES        填充(默认值)
        NO         不填充

  14) POSITION:指定打开顺序文件的访问位置,position是字符串表达式:
        ASIA       已被连接的文件的访问位置是固定的,未被连接的文件的访问位置是文件的开始处。
        REWIND     把文件的访问位置定在文件的开始处(文件己存在)。
        APPEND     把文件的访问位置定在文件的末尾处(文件己存在)。
  对于一个新文件,文件的访问位置总是被定在文件的开始处。

  15) RECL:记录长度(单位为字节)说明。recl是指定的正整型量或算术表达式,用来指定直接文件中的每条记录的字节数,或顺序文件中的记录的最大长度。

  16) SHARE:指明当文件打开时是否实现文件的锁定。share是字符串表达式:
        DENYRW     动态读写模式。不允许其他的进程打开这个文件。
        DENYWR     动态写模式。不允许其他的进程以写的方式打开这个文件。
        DENYRD     动态读模式。不允许其他的进程以读的方式打开这个文件。
        DENYNONE   默认的非动态模式。允许其他的进程打开这个文件。

  17) STATUS:文件状态说明。status是字符串表达式:
        OLD        表示指定的文件是已经存在的老文件。这一状态一般用于读操作,如果用于写操作则重写文件,原文件内容将被覆盖。如果指定的文件并不存在,则系统将给出出错信息。
        NEW        表示指定的文件尚不存在。执行OPEN语句时将在磁盘上建立该文件并使其状态改变为OLD。NEW状态一般用于写操作。如果指定的文件名已经存在将给出出 错信息(有的系统不给出信息而是把这个已经存在的文件冲掉使原来的内容不复存在)。
        SCRATCH    表示与设备号相连接的文件在关闭时将被自动删除。注意:此状态不能与FILE说明共存,只能用于由计算机系统指定的文件名,使该文件作为程序运行过程中的一个临时性文件。
        REPLACE    表示替换一个有相同名字的文件,如果没有同名的文件存在,将产生一个新文件。
        UNKNOWN    表示文件可以是已存在的或不存在的。系统打开文件状态的次序为:OLO->NEW->创建新文件。STATUS的设置值只影响磁盘文件,像键盘和显示器这样的设备将忽略这一设置。
  若省略该项时默认的状态为UNKNOWN。


b)   ENDFILE语句
ENDFILE语句的功能是在文件上写一条文件结束记录,这时文件定位在结束记录的后面。它的一般形式为:
        ENDFILE{unit|([UNIT=]unit[,ERR=err][,IOSTAT=iostat])}


由于用ENDFILE语句在文件中写入一条结束记录后,文件的指针被定位在结束记录之后,所以若再想向同一个文件中添加更多的记录,就必须使用 BACKSPACE或REWIND语句对文件进行文件指针定位的操作。在直接访问文件中使用ENDFILE语句在文件中写入一条结束记录后,新的结束记录 后的所有老的记录都将被删除掉。


c)   CLOSE语句
CLOSE语句解除设备号与文件的连接,又称关闭文件。它的一般形式为:
        CLOSE([UNIT=]unit[,ERR=err][,IOSTAT=iostat][,STATUS|DISPOSE|DISP=status])


其中除STATUS以外的各项参数的意义及取值与OPEN语句中的相同。STATUS是文件关闭后状态说明,其值是一字符串:
        DELETE             与设备连接的文件不保留,被删除
        KEEP(或SAVE)      与设备号连接的文件保留下来不被删除
        PRINT              将文件递交给打印机打印并被保留(仅对顺序文件)
        PRINT/DELETE       将文件递交给打印机后被删除
        SUBMIT             插入一个进程以执行文件
        SUBMIT/DELETE      插入一个进程以执行文件,当插入完成后被删除
默认设置将删除带有SCRATCH属性的临时文件,对其它文件为KEEP。
在程序中,没有必要显示的进行文件的关闭,—般情况下,当程序退出时将以各个文件的默认状态关闭所有的文件。CLOSE语句不必与OPEN语句出现存同一程序单元中。


d)   文件指针定位语句
REWIND
语句:称为反绕语句,它使指定设备号的文件指针指向文件的开头,通常用于顺序文件的操作。它的一般形式为:
REWIND{unit|([UNIT=]unit[,ERR=err][,IOSTAT=iostat])


BACKSPACE语句:称为回退语句,它使指定设备号的文件指针退回一个记录位置,一般用于顺序文件。它的一般形式为:
        BACKSPACE{unit|([UNIT=]unit[,ERR=err][,IOSTAT=iostat])


除了以下几种情况外,使用BACKSPACE语句正好使文件的指针向前移动一条记录:本条记录前再没有记录时文件指针的位置不变;文件指针的位置在一条记录的中间时,文件指针移到本条记录的开始处;本记录的前—记录是文件结束记录时,文件指针移到文件结束记录之前。


使用硬件设备

在Fortran中标准的输入设备是键盘,标准的输出设备是显示器(控制台)。—般的输入输出语句都是针对标准设备进行操作的,如果想对除键盘和显示器以 外的其他的物理设备进行读写操作,就应该把物理设备名描述为文件名,这样就可以像操作文件一样对其进行操作,绝大多数设备名没有扩展名。以下是 WinNT/9x下的一些设备名。

设备

描述

CON

控制台(即屏幕,标准输出设备)

PRN

打印机

COMl

1#串行通信口

COM2

2#串行通信口

COM3

3#串行通信口

COM4

4#串行通信口

LPTl

1#并行通信口

LPT2

2#并行通信口

LPT3

3#并行通信口

LPT4

4#并行通信口

NUL

空(NLTLL)设备。放弃输出,不包含任何输入

AUX

1#串行通信口

LINE1

1#串行通信口

USER1

标准输出

ERRl

标准错误

CONOUT$

标准输出

CONIN$

标准输入

下面是打开物理设备作为单元的例子:OPEN(UNIT=4,FILE=’PRN’)

输入输出的方式,包括格式化的方式和非格式化的方式。


非格式输入输出,包括直接列表I/O名称列表I/O。直接列表输出便是之前常看到的write (*), var1, var2, var3的形式。这些直接附在write语句后,用逗号分隔的就是直接列表。而直接列表输入以read (*,*), var1, var2, var3的形式。括号里的星号分别对应于设备单元(stdin)和输出格式。输入可以用星号(*)表示重复,比如10*3表示输入10个3。用斜杠(/)表示输入流的结束。


名称列表NAMELIST/名称列表组名/变量列表[[,]/组名/变量列表]...的形式表示。比如名称列表输出的代码可以是:


  1.       integer:: i1=5
  2.       logical:: l1=.true.
  3.       character*20:: c1='hello'
  4.       namelist/wlist/i1,l1,c1
  5.       write (*, nml=wlist)

上面的代码的输出为
  1. &WLIST
  2. I1= 5,
  3. L1=T,
  4. C1="hello ",
  5. /

名称列表的输出以&开头,紧接着名称列表组名,之后紧接着变量/值赋值对。最后以反斜杠/结束。名称列表输入是名称列表输出的逆过程,以&或$开头加上名称列表组名,之后以空格或换行与紧接在后面的赋值对隔开。最后以/、&或$表示结束。星号同样可以用来表示重复。

格式化输入输出要更复杂些,下面是格式化输出的例子:


  1.       integer :: i1=5, i2=2351
  2.       integer myformat
  3.       print 12345, i1, i2 !使用标号为12345的格式
  4. 12345 format(I3,I5) !定义了宽度分别为3和5的两个整型
  5.       assign 12345 to myformat !将标号格式赋给一个整型(已删除的特性)
  6.       write (*, myformat), 6313, 81 !输出*** 81。因为格式为三位,却要输出四位整型,所以显示星号。
  7.       print '(F8.3)', 23.35 !直接以字符串表示格式。fw.d表示总宽(包括负号和小数点)为w、小数部宽为d的实数
  8.       print '(E10.3)', 23432532.32 !Ew.d表示总宽为w有效位为d的指数形式。输出:0.234E+08
  9.       print '(G8.3)', 1223.54 !绝对值小于0.1或大于10的d次方的数用E格式,否则用F格式
  10.       print '(D8.3)', 234.52 !双精度数据,与E编辑符用法相仿。输出:.235D+03(四舍五入)
  11.       print '(L5)', .true. !逻辑型数据。 输出:T
  12.       print '(A)', 'a' !字符
  13.       print '(A5)', 'abc' !字符串
  14.       print '(B5.3)', 1 !二进制。Bw.d,w为字段宽度。m表示需要输出的最少数字位数,缺省值为1。输出:001
  15.       print '(O5.3)', 82 !八进制。输出:122
  16.       print '(Z5.3)', 82 !十六进制。输出:052
  17.       print '(EN16.6e2)', 23928.2 !工程计数法,ENw.d[Ee]。EN和E编辑描述符基本类似,区别在于EN输出数据的非指数部>分的绝对值强制在1到1000的范围内,且指数可以被3整除。包括指数的区域的宽度是w个字符,小数点后d个字符,指数宽度e是>可选的。输出:23.928199E+03
  18.       print '(ES16.6e2)', 23928.2 !科学计数法,和E编辑描述符也基本类似,区别在于ES输出数据的非指数部分的绝对值强
  19. 制在l到10的范围内,而非E的0到1的范围。输出:2.392820E+04
  20.       end

上例中所有的描述符都是可重复编辑描述符,因为它可以重复:
  1.       integer :: i=5
  2.       print '(2I4)', 23, 532 !表示输出两个I4格式
  3.       !print 111, 26, 232, 1921 !
  4. 11 !format(<i-2>I4) !等同于format(3I4)。gfortran不支持
  5. 12 !format(2I<i+5>) !等同于format(2I10)。gfortran不支持


不可重复编辑描述符可以改变解释重复编辑符的方式,还可以改变完成输入输出的方式。

形式

名称

用途

可否用于输入

可否用于输出

’  ’或” ”

撇号编辑

传递string到输出单元

nH

Hollerith编辑

传递下n个字符到输出单元

Q

字符计数编辑

返回记录中剩余字符的数目

T,TL,TR

位置编辑(Tab)

指定记录的位置

nX

位置编辑

指定记录的位置

SP,SS,S

可选加号的编辑

控制加号的输出

/

斜杠编辑

指向下一个记录或写记录结束符

\

反斜杠编辑

延续相同的记录

$

美元符号编辑

延续相同的记录

:

格式控制结束

如果I/O列表中没有其它记录则结束语句

kP

指数比例编辑

设置后面的F和E编辑符的指数比例

BN,BZ

空格解释

指定对数值空格的解释

下面贴出它们的详细用法:

1、撇号编辑符(单撇号’或双撇号”)用来插入所需的字符串,如 WRITE(*,’(1X,’I=’,I3,’J=’,I4)’) I,J。如果需要输出的字符包括单撇号,则用两个连续的单撇号代表一个被输出的撇号  (撇号编辑符为单撇号时)或用双撇号的编辑符,如WRITE(*,’(’I’ ’m a boy’)’)或WRITE(*,’(”I ’ma boy”)’)。

2、H编辑符用来输出字符常量,其一般形式为:nH字符串。n为字符串中 字符个数。它的作用与撇号编辑符相似。例如,上面用撇号编辑符的例子也可用H编辑符:WRITE(*,’(9HI ’m a boy)’)。用H编辑符必须准确地数出字符串中字符(包括符号,. ’)的个数,数错了就会造成错误。因此不建议使用H编辑符,而应该用A编辑符和撇号编辑符来输出字符串。F77之所以保留H编辑符主要是为了与F66兼 容,但在F95中已被废除。

3、X编辑符用来在输出时产生空格。没有空格的输出时数据是连成一片的, 难以区分开,为此需要插入空格。它的一般形式为:nX,n为插入的空格数,如WRITE(*,’(1X,’I=’,I3,5X,’J=’,I4)’) I,J在数据I和字符串’J=’之间插入5个空格。注意第一项中的1X,在行式打印机上可作为纵向走纸控制符,但在输出到文件和屏幕时,按Visual Fortran的默认编译它仅仅为空一格。

4、纵向控制符,在把格式记录中的信息传送到打印设备上(打印机或终端)时,格式说明中的第一个字符不被印出,这个字符作为纵向间隔控制标志,称为纵向控制符。它们的功能在下表中列出。

格式说明的首字符

纵向间隔控制功能

常用形式

(空格)

移到下一行开头

1X, ’ ’,1H

0(数字0)

移到下面第二行开头

’0’,1H0

1(数字1)

移到下一页第一行开头

’1’,1H1

+(加号)

移到当前行开头

’+’,1H+

其它字符

移到下一行开头

(非标准规定)

要使这些功能在VisualFortran上实现,必须按以下步骤修改默认值:对于输出到终端的情形,在菜单选项中Project -> Setting -> Fortran-> Compatibility选取Enable VMS Compatibility项。对于输出到文件的情形,在打开文件的OPEN语句中加上说明项CARRIAGECONTROL='FORTRAN'。这时 每行记录的第一个字符被当作控制符,可能产生输出的数字或字符被吃掉的情形。另外重叠印刷功能仅对于行式打印机有效,对于终端和文件的输出其效果是覆盖。


5、斜杠(/)编辑符的作用是结束记录在本行的输出并从下一行开始输出 下一个记录。如果有两个连续的斜杠,相当于增加一个空行输出。如果在编辑符的最后出现斜杠,也是再输出一个空行。用n个连续的斜杠,可以达到输出n-1个 空行的效果。如WRITE(*,’(I3,I4/I1,I2//3F8.2/)’) I,J,M,N,X,Y,Z 的输出第一行为I,J的值,第二行为M,N的值,第三行为空行,第四行是X,Y,Z的值,第五行为空行。


6、反斜杠(\)编辑符和美元($)编辑符的作用相同,都是在输出一个记录行后取消回车符。常用于输出字符串与输入数据显示于屏幕同一行的情形。
例:Write(*,’(”Please Enter Your Age =”,$)’)
Read(*,*) My_age
当屏幕上输出字符串PleaseEnter Your Age =后没有换行,My_age的数值可紧接在=号后输入。


7、位置编辑符(T,TL,TR)在用于输出时,指出将要输出到记录上的下一个字符的位置。它们的一般形式为:Tn,TLn,TRn。n是非零正整数。
T指明记录相对于左Tab端的位置,记录上的下一个字符输出第n个字符的位置上。对于行式打印输出,因为记录的第一个字符作为纵向控制符不被打印,所以Tn是定位在打印记录的第n-1个字符的位置上。在这个位置之前若没有字符输出,则填满空格。


TL用于输出时,指明把记录上的下一个字符输出到从当前位置向左移n个字符的位置上。如果左移已到记录的第一列,则不再向左移,即向左移至多回退到第一 列。TR用于输出时,指明把记录上的下一个字符传输到从当前位置向右移n个字符的位置上。如WRITE(*,’ (TR10,F6.2,TL16,F6.2)’) 4.25, -21.46语句的输出结果是-21.46      4.25。

8、冒号编辑符,当I/O列表中没有更多的数据顶时,冒号(:)编辑符使格式控制结束。此编辑将常常用于FORMAT语句中没有要输出的数据项时的输出结束。

9、P编辑符设置比例因子以改变小数点位置,它用于实数变量编辑描述符 如F、E和G编辑符。其作用范围延续到下一个比例因子的设置处。它的一般形式是:kP。k是一有符号整数以指定小数点向左或向右移几位,k取值范围在 -128至127之间。在每一个输入输出语句开始时,这个比例因子被初始化为O。输出时,正k向右移,负k向左移(输入时相反)。比例因子对下面格式编辑 符的影响:在用F编辑符输出时,这个要输出的值在显示以前将乘以10k。在用E编辑符输出时,这个要输出的值的实数部分在显示以前将乘以10k,其指数部分减k。
例:Format     Value        Output
1PE12.3   -270.139      -2.701E+02
1P,E12.2   -270.139       -2.70E+02
-1PE12.2  -270.139       -0.03E+04
例:dimension a(6)
a=25.;write(*, "(' ',f8.2,2pf8.2,f8.2)") a
其输出是:   25.00 2500.00 2500.00
2500.00 2500.00 2500.00

10、SP,SS和S编辑符在数字输出字段中控制着任选加号(+)的打印。SP在其后所有正数值域的位置输出加号,SS为不输出加号,S重新储存SS使其后不输出加号。


格式化输入的编辑符与格式化输出类似。多出了一些编辑符:
1、BN,BZ编辑符在数字输入字段中控制着空格的解释。BN编辑符忽略数字输入字段中内嵌和后续空格,使格式控制器仅使用字段上的所有非空格字符,并使它们向右对齐。BZ编辑符使结尾空格符和分散空格符为零,而开头空格符仍为零。
2、Q编辑描述符返回当前输入记录中剩余的字符数。对应的I/O列表中的数据项必须是整型或逻辑型的。


下面贴两段格式与I/O列表的关系:
输出格式指定和I/O列表

在输出语句执行时,I/O列表中的每一项都和一个可重复编辑符联系(I/O列表中的复型数据需要两个编辑符),非重复编辑符不和I/O列表中的数据项联 系。如果I/O列表包含一个或多个数据项,则在格式指定时至少有一个可重复编辑符。空的编辑指定()只能用在I/O列表没有数据项的情况。一条编辑指定为 空的FORMAT()格式WRITE语句输出的是回车换行。

在格式输入输出过程中,格式控制器从左向右扫描格式数据项。下面列出了格式控制器可能碰到的具体情况及相应的解释:

1) 如果I/O列表中出现了可重复编辑符和相应的数据项,该数据项和编辑符是互相联系的,该数据项的输出会在编辑符的格式控制下执行。如果没有相应的数据项格式控制器将中止输出,即多余的编辑符无效。

2) 如果I/O列表中项数多于格式说明中的可重复编辑符个数,即WRITE语句中的输出项表列中还有末输出的元素,而格式说明中的编辑符已用完,则重新使用该格式说明,但从下一行开始产生一个新记录。

3) 如果在格式说明中包含有重复使用的编辑符组,则当格式说明用完后再重新使用时,只有最右面的一个编辑符组(包括其重复系数)和它右面的编辑符被重复使用。

4) 遇格式说明的右括号(即最后面一个括号)或斜杠“/”时,结束本记录的输出,但不意味停止全部输出。只要I/O列表中还有未输出的量,将重复使用格式说明 或按斜杠右面的格式说明组织输出。右括号与斜杠的不同是:当扫描到右括号而列表中已无数据项时,输出即告结束。而斜杠只表示结束本行输出,即使此时已无输 出变量要输出,输出并未停止,它会重新开始一个新记录,直到遇到右括号或非重复编辑符为止。

5) 如果出现冒号编辑符(中止格式控制)且I/O列表中没有其它项,则格式控制器将中止输入输出。


输入格式指定和I/O列表

一条编辑指定为空的FORMAT()格式READ语句将跳过相邻的下一个记录,除非输入输出设置成ADVANCE=’NO’,这时文件位置将保持不变。记 录中的字符如果少于编辑符指定的长度,在右侧会填以空格,除非在OPEN语中指定PAD=’NO’。用户输入的空格的解释取决于空格编辑描符(BN或 BZ)的作用或OPEN语句中的BLANK=选项。BN和BZ的优先级比BLANK=选项要高。


总结起来,输入输出的语句包括

语句

功能

ACCEPT

输入数据,和格式化顺序READ语句类似

BACKSPACE

定位到文件上一个记录开始处

CLOSE

断开和一个单元(文件和设备)的连接

DELETE

从相关文件中删去一条记录

ENDFILE

写一个文件结束记录

INQUIRE

返回一个单元或外部文件的属性

OPEN

使一个单元号和一个文件或设备相连接

PRINT

向星号单元(屏幕)输出数据

READ

从一个文件向I/O列表中的项目输入数据

REWIND

重新定位于文件的开头

REWRITE

覆盖当前记录

UNLOCK

释放先前被READ语句锁定的相关或顺序文件中的一个记录

WRITE

从一个I/O列表中的项目向文件输出数据 

阅读(9967) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~