分类: C/C++
2012-03-26 13:59:47
文件分为外部文件和内部文件。外部文件包括外部设备(如键盘和屏幕)以及磁盘上的文件,而内部文件指在内存中可以像磁盘文件一样进行操作的数据块。
为了对文件进行操作,需要使用逻辑设备与它们连接。外部文件可以通过open(unit=id,file='filename')的方式打开,id便是逻辑设备的标识符,可以用来读写,也能用close关闭文件。设备号的取值范围为-32768到32767。
Fortran预定义了4种外部文件(设备):
设备号 |
连接的设备 |
星号(*) |
总是键盘和显示器 |
0 |
缺省状态下是键盘和显示器 |
5 |
缺省状态下是键盘 |
6 |
缺省状态下是显示器 |
此前所有的print *, ...语句就是表示向显示器输出。*设备不能被关闭。
内部文件对应的逻辑设备可以用一个变量名来表示:
外部文件的访问方式有两种:顺序访问和直接访问;而文件结构有三种:格式化文件、无格式文件和二进制文件。这样组合出来的文件有六种。
1、格式化顺序文件
以可读的字符串形式进行(顺序)读写。文件打开时在文件开头写入(文件原有数据会被清空),之后每次在文件末尾处写入一条记录。所有记录的大小不定,且由回车符加换行符(即\r\n)分隔。下面是一个例子:
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$ |
标准输入 |
输入输出的方式,包括格式化的方式和非格式化的方式。
非格式输入输出,包括直接列表I/O和名称列表I/O。直接列表输出便是之前常看到的write (*), var1, var2, var3的形式。这些直接附在write语句后,用逗号分隔的就是直接列表。而直接列表输入以read (*,*), var1, var2, var3的形式。括号里的星号分别对应于设备单元(stdin)和输出格式。输入可以用星号(*)表示重复,比如10*3表示输入10个3。用斜杠(/)表示输入流的结束。
名称列表以NAMELIST/名称列表组名/变量列表[[,]/组名/变量列表]...的形式表示。比如名称列表输出的代码可以是:
格式化输入输出要更复杂些,下面是格式化输出的例子:
不可重复编辑描述符可以改变解释重复编辑符的方式,还可以改变完成输入输出的方式。
形式 |
名称 |
用途 |
可否用于输入 |
可否用于输出 |
’ ’或” ” |
撇号编辑 |
传递string到输出单元 |
否 |
是 |
nH |
Hollerith编辑 |
传递下n个字符到输出单元 |
否 |
是 |
Q |
字符计数编辑 |
返回记录中剩余字符的数目 |
是 |
否 |
T,TL,TR |
位置编辑(Tab) |
指定记录的位置 |
是 |
是 |
nX |
位置编辑 |
指定记录的位置 |
是 |
是 |
SP,SS,S |
可选加号的编辑 |
控制加号的输出 |
否 |
是 |
/ |
斜杠编辑 |
指向下一个记录或写记录结束符 |
是 |
是 |
\ |
反斜杠编辑 |
延续相同的记录 |
否 |
是 |
$ |
美元符号编辑 |
延续相同的记录 |
否 |
是 |
: |
格式控制结束 |
如果I/O列表中没有其它记录则结束语句 |
否 |
是 |
kP |
指数比例编辑 |
设置后面的F和E编辑符的指数比例 |
是 |
是 |
BN,BZ |
空格解释 |
指定对数值空格的解释 |
是 |
否 |
格式说明的首字符 |
纵向间隔控制功能 |
常用形式 |
(空格) |
移到下一行开头 |
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使其后不输出加号。
下面贴两段格式与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 |
使一个单元号和一个文件或设备相连接 |
|
向星号单元(屏幕)输出数据 |
READ |
从一个文件向I/O列表中的项目输入数据 |
REWIND |
重新定位于文件的开头 |
REWRITE |
覆盖当前记录 |
UNLOCK |
释放先前被READ语句锁定的相关或顺序文件中的一个记录 |
WRITE |
从一个I/O列表中的项目向文件输出数据 |