fortran90程序设计chapter12.docx
- 文档编号:24247545
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:64
- 大小:189.89KB
fortran90程序设计chapter12.docx
《fortran90程序设计chapter12.docx》由会员分享,可在线阅读,更多相关《fortran90程序设计chapter12.docx(64页珍藏版)》请在冰豆网上搜索。
fortran90程序设计chapter12
第十二章文件与设备
12.1概述
我们知道,程序处理的对象是数据,任何程序都离不开数据,没有数据的程序是无用的程序。
如何在程序中有效组织数据是设计和编写程序的基本要求。
在前面几章,程序涉及的数据都比较少,这些数据或者在程序内部生成、或者从键盘输入、或者从显示器上输出。
例如,下面给出统计5个数据平均值的示例程序。
PROGRAMexam1
PARAMETER(n=5)
REAL:
:
score(n),sum=0.0,ave
score=(/78.5,55.0,85.5,90.0,68.5/)!
内部生成数据
!
READ(*,*)(score(I),I=1,n)!
或者从键盘输入数据
DOI=1,n
sum=sum+score(I)
ENDDO
ave=sum/n
WRITE(*,100)(score(I),I=1,n)
WRITE(*,200)ave
100FORMAT(1X,F5.1,:
','\)
200FORMAT(1X,'平均分数:
',F5.1)
END
对于上述程序,程序所处理的数据比较少(5个数据),数据通过赋值语句在内部生成(也可通过READ语句从键盘输入),数据通过WRITE语句从显示器上输出。
数据的这种组织方式在数据量比较少的情况下是可行的,并没有什么不足之处。
问题是如果程序处理的数据量比较大(如:
20个、30个、50个、100个、…),数据的这种组织方式将给程序的设计、编写和使用带来诸多不便。
如果程序处理的数据个数达到100个,则在程序中就要写100个数据。
如果这些数据有所变化,则需要在程序中直接修改数据,每次修改后,都需要重新编译、构建和运行。
这种在程序中直接修改数据的做法是非常危险的,容易产生错误,将严重影响程序的可靠性。
如果数据是从键盘输入,则每次运行程序都要从键盘输入100个数据。
程序每次运行都从显示器上输出数据,输出的数据在程序运行结束后也随即消失,不复存在。
程序的上述弊病是由程序和数据过于紧密以及数据组织方式不当所致。
如果我们将程序和数据进行一定分离,将程序所处理的数据以文件形式单独组织,则能有效克服这些弊病,给程序设计、编写和使用带来方便,大大提高程序的可靠性。
例如,下面给出使用文件组织数据的示例程序。
PROGRAMexam2
PARAMETER(max=100)
REAL:
:
score(max),n,sum=0.0,ave
OPEN(1,FILE='exam2.in')
OPEN(2,FILE='exam2.out')
READ(1,*)n
IF(n<=max)THEN
READ(1,*)(score(I),I=1,n)
DOI=1,n
sum=sum+score(I)
ENDDO
ave=sum/n
WRITE(2,*)'学生成绩有:
'
WRITE(2,100)(score(I),I=1,n)
WRITE(2,200)ave
PRINT*,'程序运行正常结束。
'
100FORMAT(1X,F5.1,:
','\)
200FORMAT(1X,'平均分数:
',F5.1)
ELSE
PRINT*,'输入数据太多,超出存储空间要求。
'
ENDIF
END
上述程序使用数据文件“exam2.in”(称为输入数据文件)来组织待输入的有关数据,如:
有n个成绩数据。
使用数据文件“exam2.out”(称为输出数据文件)来存放输出数据,如:
提示信息“学生成绩有:
”;n个成绩数据;平均分数ave等。
对于输入数据文件(文本文件)需要在程序运行前通过DevaloperStudio开发环境建立,并编辑输入有关输入数据。
对于输出数据文件无需事先建立,程序运行过程中自动创建,并将数据输出到程序新创建的输出数据文件中,其后可随时打开输出数据文件,浏览输出数据,也可被其它程序使用。
在程序中使用数据文件,需要通过OPEN语句打开这些文件,指定逻辑设备和外部文件名,建立两者间的相互关系。
在输入输出语句中,直接使用相关的逻辑设备号(如:
1、2)从文件中输入数据,或将数据输出至文件。
改变数据文件中数据不影响程序代码,程序不需重新编译和构建,直接运行即可。
程序、输入数据文件和输出数据文件之间的关系如图12-1所示。
图12-1程序和数据文件的相互关系
12.2物理设备和逻辑设备
计算机系统除主机外,还配备有丰富的外部设备,如:
磁盘、磁带、磁鼓、显示器、键盘、打印机等,这些设备称为物理设备。
每个文件中的数据都要存放到某个外部设备上。
文件与设备密切相关,离开了设备,文件也失去了存在的意义。
外部文件是建立在物理设备上的文件(如:
磁盘文件),程序中要使用外部文件,必须说明文件及所在的物理设备,这样便可使用某个物理设备上的某个文件,以便从文件中输入数据或将数据输出到文件。
物理设备是比较复杂的设备,在程序中直接使用物理设备对程序设计人员来说有一定难度,所以在程序中并不直接使用物理设备,而是使用逻辑设备来完成对文件的操作。
使用逻辑设备符合程序与设备的独立性原则,目前所有高级程序设计语言都使用逻辑设备。
在程序中只对逻辑设备进行操作,而逻辑设备与物理设备的联系及物理设备的底层操作由操作系统完成。
一个物理设备可定义多个逻辑设备,一个逻辑设备可与不同物理设备连接。
程序中通过设备描述符(UNIT)说明外部文件所在的逻辑设备,每个逻辑设备都指定一个唯一的设备描述符。
内部文件是建立在内存储器上的文件,内部文件的设备描述符为字符型变量名、字符型数组名、字符数组元素名或子串名,即字符型变量名、字符型数组名、字符数组元素名或子串名可看作是内部文件所在的逻辑设备,与内部文件名相同,内部文件所在的物理设备为内存储器,如图12-3所示。
图12-3内部文件、逻辑设备和物理设备及其相互关系
外部文件的设备描述符称为逻辑设备号,简称为设备号,用一个整数表示,它通过OPEN语句在打开文件时指定。
预定义设备(标准设备、缺省设备)的设备号由系统隐含规定,不用OPEN语句指定,在输入输出语句中直接使用,预定义设备号如表12-1所示。
一个设备号只能与一个文件建立联系,同样一个文件只能与一个设备号建立联系。
一个已通过OPEN语句打开并指定了设备号的文件不能再次用OPEN语句打开,必须通过CLOSE语句关闭该文件后才能再次打开。
外部文件名、设备号和物理设备及其关系如图12-4所示。
设备号由用户在程序中任意指定。
同一外部文件在不同程序中的设备号可以相同,也可以不同,只要保证唯一性即可。
在输入输出语句中使用设备号完成文件的输入输出操作,如同使用物理设备操作一样。
表12-1标准设备号
设备号(逻辑设备)
所连接物理设备
*
总是键盘或显示器
0
缺省情况下是键盘或显示器
5
缺省情况下是键盘
6
缺省情况下是显示器
图12-4外部文件、逻辑设备和物理设备及其相互关系
12.3文件
所谓文件就是存放在某种存储介质(如:
磁盘)上的一组数据的集合,它由文件名来唯一标识。
一个数据文件由一组记录组成,程序对文件的存取以记录为单位,从文件中一次输入一个记录,或向文件中一次输出一个记录。
文件中可以有记录数据,也可没有记录数据,没有数据记录的文件称为空文件。
通过READ和WRITE语句输入输出文件中的记录数据。
文件分外部文件和内部文件两种。
12.3.1外部文件
外部文件是指连接在计算机主机上的一类外部设备(如:
键盘、显示器、打印机等)或存放在外存储器(如磁盘、磁带、磁鼓等)上的文件。
外部文件的主要特点是可长期保存数据,大批量的数据一般以外部文件的形式存放在外部存储介质上,以便于数据的输入、输出和修改操作。
如:
数据文件“exam2.in”和“exam2.out”。
如果要在程序中使用外部文件,则必须先用OPEN语句为外部文件指定设备号(标准设备除外),并建立外部文件与设备号之间的联系,然后才能进行输入输出操作。
可用一个整型表达式指定设备号,设备号取值范围为:
-32768~32767。
例如:
OPEN(1,FILE='exam2.in')
OPEN(2,FILE='exam2.out')
READ(1,*)(score(I),I=1,N),DOI=1,N)
WRITE(2,*)'学生成绩有:
'
其中:
1是通过第一个OPEN语句为外部文件“exam2.in”指定的设备号;2是通过第二个OPEN语句为外部文件“exam2.out”指定的设备号。
READ语句从1号设备中读取一组数据到数组score中(即从外部文件“exam2.in”读取数据)。
WRITE语句将数据输出到2号设备中(即将数据输出到外部文件“exam2.out”中)。
下面给出使用外部文件的示例程序。
PROGRAMexam3
INTEGERfac
!
输出数据至显示器,设备号可以是*或6
WRITE(*,"('输入一个整数N:
'\)")!
或者WRITE(6,*)'输入一个整数N:
'
!
从键盘输入数据,设备号可以是*或5
READ(*,*)N!
或者READ(5,*)N
!
使用OPEN语句打开一个外部文件,设备号为1
OPEN(UNIT=1,FILE='factor.dat',STATUS=‘NEW’)
fac=1
DOI=1,N
fac=fac*I
!
向设备号为1的外部文件输出数据,有格式输出
WRITE(1,"(I3,'!
=',I7)")I,fac
ENDDO
!
关闭设备号为1的逻辑设备
CLOSE
(1)
!
向显示器输出数据
WRITE(6,*)'程序运行结束。
'
END
运行程序,输入数据为:
输入一个整数N:
5↙
程序运行结束后,从显示器输出数据为:
“程序运行结束。
”,外部文件“factor.dat”中输出数据为:
1!
=1
2!
=2
3!
=6
4!
=24
5!
=120
对于外部文件“factor.dat”,由于未指定磁盘符和路径,所以在程序所在项目文件夹中创建该文件。
通过添加操作将文件添加到工作区中,可随时打开查看。
12.3.2内部文件
内部文件是存放在内存储器(内存)上的文件,如:
字符型变量、字符型数组、字符型数组元素、字符子串都可视作内部文件。
内部文件不能长期保存数据,程序运行过程中存在,程序运行结束后消失,一般用于少量的二进制数值数据与字符型数据相互转换,以及字符串的合并或截取,例如:
PROGRAMexam4
CHARACTER*40str1,str2
str1='125,250,375'
READ(str1,*)i,j,k
WRITE(str2,100)i,j,k,i+j+k
100FORMAT('i=',I3,'j=',I3,'k=',I3,'i+j+k=',I3)
PRINT*,i,j,k
PRINT*,str2
END
程序中字符型变量str1和str2作为内部文件使用,通过输入输出语句完成内部文件数据的输入输出。
输入语句“READ(str1,*)i,j,k”的功能是从内部文件str1(字符型变量)中按表控格式输入125、250、375至整型变量i、j、k中,而不是从键盘或外部文件中读取数据。
输出语句“WRITE(str2,100)i,j,k,i+j+k”的功能是将i、j、k、i+j+k的值按格式语句指定的格式输出至字符型变量str2中。
语句执行后,str2的值为“i=125j=250k=375i+j+k=750”。
程序执行结束后,输出数据为:
125250375
i=125j=250k=375i+j+k=750
说明:
①如果内部文件只有一条记录,则使用字符型变量名、字符型数组元素名或子串名为内部文件名,采用表控格式或有格式输入输出。
②如果内部文件有多条记录,则使用字符型数组名为内部文件名,采用有格式输入输出,格式编辑符可出现换行编辑符,数组元素的存储顺序与输入输出行的顺序一致。
③如果内部文件为动态字符数组或动态字符数组片段,则在文件使用前必须分配内存空间。
④如果内部文件为指针字符变量,则在文件使用前必须将指针连接到目标上。
⑤对于内部文件,直接使用输入输出语句对其进行读写操作,不能使用OPEN、REWIND、BACKSPACE、INQUIRE等文件操作语句。
⑥对内部文件进行有格式输入输出时,可使用格式说明串或FORMAT语句进行格式说明。
内部文件主要用于数据的字符表示和内存表示之间的转换,可将整数、实数、复数或逻辑值转换为字符串表示形式,可将字符串转换为整数、实数、复数或逻辑值。
有了这一功能,即使不知道字符串的具体内容,也能读取、分析、处理字符串。
12.3.3文件标识
每一个文件都要有一个文件标识,用于文件的识别和存取。
外部文件的文件标识为文件名。
文件名由两部分组成:
文件名字和文件类型,文件类型也称文件扩展名,两部分之间用小数点“.”连接,如文件名“exam2.in”中的“exam2”为文件名字,“in”为文件类型,文件名的命名规则遵守Windows命名规则。
文件名前可给出存储设备名和路径,以指定文件所在设备和位置,如扩充文件名为“D:
\fileexample\exam2\exam2.in”,其中:
D指定文件存放在“D:
”磁盘驱动器上;“\fileexample\exam2\”指定文件存放在该文件夹中。
如果不指定设备名和路径,则文件存放在当前设备和文件夹中。
在某些计算机系统中也可以使用特定的文件名代替某种标准的输入输出设备(如:
终端、打印机等)。
如果不指定文件扩展名,则有计算机系统根据文件特点指定一个缺省的文件扩展名,如:
FORTRAN90程序文件的缺省扩展名为“f90”,文本数据文件的缺省扩展名为“txt”,图形文件的缺省扩展名为“bmp”。
内部文件的文件标识为字符型变量名、字符型数组名、字符型数组元素名或字符子串名。
用在输入输出语句中设备名位置的字符型变量名、字符型数组名、字符型数组元素名或字符子串名作为内部文件标识,用在其它位置则按普通变量名、数组名、数组元素名、子串名对待。
12.4外部文件分类
本章介绍的外部文件指磁盘数据文件,简称文件。
文件中数据存储在外存储器磁盘上,文件中的数据记录在磁盘设备上按规定的结构存储,并规定了对记录的存取方式。
FORTRAN90支持两种存取方式(顺序存取、直接存取)和三种文件格式(有格式、无格式、二进制)。
FORTRAN90中允许使用以下六种文件类型。
●有格式顺序存取文件。
●有格式直接存取文件。
●无格式顺序存取文件。
●无格式直接存取文件。
●二进制直接存取文件。
●二进制顺序存取文件。
六种文件类型各有特点。
在程序中使用何种类型的文件要根据程序的具体要求确定。
12.4.1文件存储格式
文件存储格式是指文件中数据的存储规则。
有三种存储格式:
有格式、无格式和二进制。
1.有格式存储格式
有格式存储格式是指文件中数据以字符形式(ASCII码)存放,以ASCII码的回车符(CR)和换行符(LF)作为字符行的结束标志。
这类文件的一个记录为一个字符行,通常称这类文件为文本文件,它可由任意文本编辑器(如:
Windows中的记事本)创建、编辑、修改和浏览。
如果要直接查看和阅读文件中的数据内容,则使用有格式文件。
在用OPEN语句打开或建立一个有格式文件时,可使用FORM选项设置有格式存储格式(如:
FORM='FORMATTED'),缺省FORM选
项默认设置该格式。
例如:
OPEN(UNIT=1,FILE='exam2.in',FORM='FORMATTED')
OPEN(UNIT=2,FILE='exam2.out')
被打开的文件“exam2.in”和“exam2.out”都是有格式顺序文件。
2.无格式存储格式
无格式存储格式是指文件中数据以二进制形式存放。
无格式顺序存取文件的记录数据为不定长的二进制位串,长度不能超过128个字节。
无格式直接存取文件的记录数据为定长的二进制位串。
无格式文件中的记录称为逻辑记录,它不能用文本编辑器查看。
如果不允许直接查看和阅读文件中的数据内容,则使用无格式文件。
在用OPEN语句打开或建立一个无格式文件时,必须使用FORM选项设置无格式存储格式(如:
FORM='UNFORMATTED')。
例如:
OPEN(UNIT=1,FILE='exam2.in',FORM='UNFORMATTED')
被打开的文件“exam2.in”是无格式顺序文件。
对无格式文件进行输入输出操作时无需进行格式控制,如:
READ
(1)N。
3.二进制存储格式
二进制存储格式是指文件中数据以真正的二进制编码形式(在内存的存储形式)存放。
二进制顺序存取文件的记录数据为不定长的二进制位串,长度不受限制。
二进制直接存取文件的记录数据为定长二进制位串,它不能用文本编辑器查看。
二进制文件是读写速度最快、读写效率最高的文件,适合于大批量数据的存储。
二进制文件是Windows系统的一种扩充文件格式。
如果要提高程序的运行效率,则使用二进制文件。
在用OPEN语句打开或建立一个二进制文件时,必须使用FORM选项设置二进制存储格式(如:
FORM='BINARY')。
例如:
OPEN(UNIT=1,FILE='exam2.in',FORM='BINARY')
被打开的文件“exam2.in”是二进制顺序文件。
对二进制文件进行读写操作时无需进行格式控制,如:
READ
(1)N。
12.4.2文件存取方式
文件存取方式是指对文件中数据进行读写的操作方式,也称文件访问。
有两种存取方式:
顺序存取和直接存取。
内部文件只有顺序存取,外部文件可顺序存取,也可直接存取。
顺序存取文件中记录长度可以不同,直接存取文件中记录长度必须相同。
1.顺序存取方式
顺序存取方式是指在进行存取操作时只能从第一个记录开始一个记录一个记录依次进行,也就是说在程序中要读写第N个数据时,必须先读写前面的N-1个数据,读写过程中可使用REWIND或BACKSPACE语句改变文件指针位置(读写记录位置)。
一般称具有顺序存取方式的文件为顺序文件。
对于键盘、显示器、打印机等外部设备,只能进行顺序存取;对于磁盘设备,可进行顺序存取,也可进行直接存取。
在用OPEN语句打开或建立一个文件时,可使用ACCESS选项设置顺序存取方式(如:
ACCESS='SEQUENTIAL'),顺序存取方式对有格式文件可默认。
例如:
OPEN(UNIT=1,FILE='exam2.in',ACCESS='SEQUENTIAL')
OPEN(UNIT=2,FILE='exam2.out')
被打开的文件“exam2.in”和“exam2.out”都是顺序文件。
说明:
①使用READ语句读取文件数据时,READ语句输入表中的输入项其类型和格式说明要与当前文件指针位置数据的类型和格式一致,一一对应。
②使用READ语句读取文件数据时,从当前文件指针位置读取,完成读取操作后文件指针向后移动一个记录。
在OPEN和REWIND语句执行后,文件指针指向第一个记录,之后从第一个记录开始读取数据。
③使用READ语句读取文件数据时,如果输入表中输入项个数少于当前记录中数据段个数,则记录中多余的数据段被忽略,下一个READ语句从下一个新的记录开始读取数据。
如果输入表中输入项个数多于当前记录中数据段个数,则继续读取下一条记录,直到输入表中的所有输入项全部读取到数据或遇到文件结束标志。
④使用WRITE语句写入文件数据时,从当前文件指针位置写入数据,完成写入操作后文件指针向后移动一个记录。
在OPEN和REWIND语句执行后,文件指针指向第一个记录,之后从第一个记录开始写入数据。
如果文件已存在,则文件原来的数据内容将全部丢失,因此,要想更新顺序文件中的某个记录,必须把文件全部数据内容重写。
⑤使用WRITE语句写入文件数据时,从当前文件指针位置开始创建新记录并写入数据,可使用FORMAT语句中的格式说明及括号、斜杠编辑符(/)创建多个新记录并写入数据。
完成写入操作后,文件指针向后移动一个或多个记录。
⑥在使用READ语句读取数据后,立即使用WRITE语句写入数据,则当前写入的记录就称为文件的最后一个记录,该记录后的数据将全部丢失。
如果在文件末尾写入(追加)新的记录数据,则可先通过READ语句循环读取数据至文件末尾,然后用WRITE语句把数据写入即可。
例如:
100READ(1,*,END=200)
GOTO100
200WRITE(1,*)'*********'
⑦在使用WRITE语句写入数据后,立即使用READ语句读取数据,则会遇到一个文件结束标志,读取数据为空。
如果写入数据后要立即进行读取数据操作,则必须使用重定位语句(如:
OPEN、REWIND、BACKSPACE等)对文件指针进行重新定位。
⑧可使用表控输入输出语句对顺序文件进行读写操作,与使用键盘和显示器输入输出类似。
2.直接存取
直接存取方式是指在进行存取操作时可以读写任意一个记录(数据),也称随机存取方式。
一般称具有直接存取方式的文件称为直接文件。
只能对磁盘上存放的外部文件进行直接存取。
直接存取文件中的记录从1开始被顺序编号,记录的长度固定不变。
在用OPEN语句打开或建立一个文件时,可使用ACCESS选项设置直接存取方式(如:
ACCESS='DIRECT'),使用RECL选项设置记录长度(如:
RECL=<记录长度>)。
顺序存取方式对无格式文件可默认。
例如:
OPEN(UNIT=2,FILE='exam2.out',ACCESS='DIRECT',RECL=40)
被打开的文件“exam2.out”是记录长度为40字节的有格式直接存取文件。
直接文件中的记录是通过记录号来存取的。
直接文件具有存取速度快、存取效率高的明显优点。
常用来建立数据库。
说明:
①直接存取文件中每个记录的长度必须相等。
如果使用WRITE语句写入数据,且输出数据的长度不等,则根据输出数据的最大长度确定直接存取文件的记录长度,通过OPEN语句的RECL选项设置。
记录长度可由格式说明中的总域宽决定。
②如果使用一个旧文件,且在OPEN语句设置的记录长度与文件实际的记录长度一致,则能正确读取数据,否则读取错误的数据。
一个空格占具一个字节长度。
回车符不计入记录长度。
③对创建的直接存取文件可使用顺序存取方式打开进行读取操作,按顺序读取记录。
对创建的顺序存取文件,只要记录长度相等,也可使用直接存取方式打开进行读取操作。
④对于表控输入输出语句,由于记录长度不好确定和控制,因此一般不用于直接存取。
12.4.3文件定位
每一个文件都有一个隐含的指针,称为文件指针,文件指针指向文件中的一个记录,来控制文件的当前读写位置。
文件打开后,文件指针指向第一个记录。
文件指针指向的记录称为当前记录。
文件指针指向第一个记录位置,称为文件的起始位置,文件指针指向最后一个记录位置,称为文件的结束位置。
对于顺序文件,在读写前,要对文件指针进行定位,对于直接文件,在读写过程中,要对文件指针进行定位。
在文件数据的读写过程中,只对文件指针指向的当前记录进行读写(存取)。
文件指针如图12-5所示。
记录1
记录2
·
·
·
记录i
·
·
·
记录n
图12-5文件指针
12.5文件基本操作
文件基本操作主要指对文件的打开、关闭、读取、写入,以及其它一些有关文件的操作。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- fortran90 程序设计 chapter12
![提示](https://static.bdocx.com/images/bang_tan.gif)