(完整版)fortran文件操作

(完整版)fortran文件操作
(完整版)fortran文件操作

fortran文件操作

From: 《Fortran 95 程序设计》彭国伦

1.文件读取的概念:

读取:“顺序读取”和“直接读取”。

保存:“文本文件”和“二进制文件”。

二进制文件:读取快,因为保存格式和数据在内存中的保存方法一样,同时也节省空间。

----------------------------------

2. 文件的操作:

----------------------------------

open的使用:使用open命令打开文件之后,就可以对文件来做输入输出。

example:

program ex0901

impicit none

open(unit=10, file='hello.txt') ! 打开hello.txt文件, unit指定文件代码,file 指定文件名称。

write(10, *) "hello" !在代码为10的文件中写入hello

stop

end program ex0901

open中有很多参数可以使用,详细如下:

OPEN(UNIT=number, FILE='filename', FORM='...', STATUS='...', ACCESS='...', RECL=length, ERR=label, IOSTAT=iostat, BLANK='...', POSITION='...', ACTION=action, PAD='...', DELIM='...')

UNIT='number': number必须是一个正整数,它可以使用变量或是常量来赋值。number最好避开1,2,5,6。因为2,6是默认的输出位置,也就是屏幕。1,5则是默认的输入位置,键盘。

FILE='filename':指定要打开的文件名称,文件名要符合系统规定。windows下不区分大小写,unix下则会区分大小写,最好不要使用中文文件名。

FORM='FORMATTED' OR 'UNFORMATTED'

FORM字段只有两个值可以设置:

FORM='FORMATTED' “文本文件”格式来保存

FORM='UNFORMATTED' “二进制文件”格式保存

这一栏不给定时候的默认值是: FORM='FORMATTED'

STATUS='NEW' or 'OLD' or 'SCRATCH' or 'UNKNOWN' 用来说明打开一个新的文件或已经存在的旧文件。

STATUS='NEW' 打开一个原本不存在的新文件

STATUS='OLD' 打开一个原来已经存在的文件

STATUS='REPLACE' 若文件已经存在则重新创建一次,原来的内容消失;若不存在则会创建新文件。

STATUS='SCRATCH' 表示要打开一个暂存文盘,这个时候可以不需要指定文件名称,也就是FILE这个一栏可以忽略。因为程序本身会自动取一个文件名,至于文件名是啥也不重要,因为暂存盘会在程序结束后自动删除。

STATUS='UNKNOWN' 由各编译器自定义。通常会同REPLACE的效果。

!这一栏不给定时,默认为STATUS='UNKNOWN'。

ACCESS='SEQUENTIAL' or 'DIRECT' 设置读写文件的方法:

ACCESS='SEQUENTIAL' 读写文件的操作会以“顺序”的方法来做读写,“顺序读取文件”。ACCESS='DIRET' 读写文件的操作可以任意指定位置,“直接读取文件”。

!不赋值时候,默认为: ACCESS='SEQUENTIAL'。

RECL=length 在顺序读取文件中,RECL字段值用来设置一次可以读取多大容量的数据。

打开“直接读取文件”,RECL=length的length值是用来设置文件中每一个模块单元的分区长度。

length的单位在文本根式下为1个字符,也就是1 byte。在二进制格式下则由编译器自行决定,一般可能为1 byte (G77) 或 4 byte (Visual Fortran)。

ERR=LABEL 这个字段用来设置当文件打开发生错误时,程序会跳跃到LABEL所指定的行代码处来继续执行程序。

IOSTAT=var 这个字段会设置一个整数值给后面的整型变量,这是用来说明文件打开的状态,数值会有下面三种情况:

var>0 表示读取操作错误

var=0 表示读取操作正常

var<0 表示文件终了

BLANK='NULL' or 'ZERO' 用来设置输入数字时,当所设置的格式字段中有空格存在时所代表的意义。

BLANK='NULL'时,空格代表没有东西。BLANK='ZERO'时,空格部分会自动以0代入。

以下是Fortran 90添加的功能:

POSITION='ASIS' or 'REWIND' or 'APPEND' 设置文件打开时候的读写位置:POSITION='ASIS' 表示文件打开时的读取的位置不特别指定,通常就是在文件的开头。是默认值。

POSITION='REWIND' 表示文件打开时的读取位置移到文件的开头。

POSITION='APPEND' 表示文件打开时的读取位置移到文件的结尾。

ACTION='READ' or 'WRITE' or 'READWRITE' 设置打开文件的读写权限:

ACTION='READWRITE' 表示所打开的文件可以用来读取及写入,这是默认值。

ACTION='READ' 表示所打开的文件只能用来读取数据。

ACTION='WRITE' 表示所打开的文件只能用来写入数据。

PAD='YES' or 'NO'

PAD='YES' 在格式化输入时,最前面的不足字段会自动以空格填满,默认值是PAD='YES'。PAD='NO' 在格式化输入时,不足的字段不会自动以空格填满。

DELIM='APOSTEROPHE' or 'QUOTE' or 'NONE'

DELIM='NONE' 纯粹输出字符串内容

DELIM='QUOTE' 输出字符串内容会在前后加上双引号

DELIM='APOSTEROPHE' 输出字符串内容会在前后加上单引号

-----------------------------------------

WRITE & READ的使用(详细):

WRITE/READ(UNIT=number, FMT=format, NML=namelist, REC=record, IOSTAT=stat,

ERR=errlabel, END=endlabel, ADVANCE=advance, SIZE=size)

UNIT=number 指定read/write所使用的输入输出的位置。

FMT=format 指定输入输出格式的使用。

NML=namelist 指定读写某个NAMELIST的内容(后续介绍)。

REC=record 在直接读取文件中,设置所要读写的文件的模块位置。

IOSTAT=stat 会设置一个数值给在它后面的变量,用来说明文件的读写状态。

stat>0 表示读取操作发生错误。

stat=0 表示读取操作正常。

stat<0 表示文件终了。

ERR=errlabel 指定在读写过程中发生错误时,会转移到某个行代码来继续执行程序。END=endlabel 指定在读写到文件末尾时,要转移到某个行代码来继续执行程序。

以下是fortran 90添加功能:

ADVANCE='YES' or 'NO' 设置在文本格式下的顺序文件中,每一次的READ,WRITE命令完成后,

读写位置会不会自动想下移动一行。

ADVANCE='YES' 是默认的状态,每读写一次会向下移动一行。

ADVANCE='NO' 会暂停自动换行的操作。

!使用这个字段时候一定要设置输出入格式,在屏幕输出时可以使用这个设置来控制write命令是否会自动换行。

SIZE=count 在ADVANCE='NO'时,才可以使用这个字段。它会把这一次输出入的字符数目设置给后面的整型变量。

----------------------------------

查询文件的状态INQUIRE:

在使用open打开文件的前后,都可以通过inquire命令来查询文件目前的情况,inquire 命令中的各个字段和第一小节中open的字段很类似。

example: !检查某个程序是否存在

program ex0903

implicit none

character(len=20) :: filename = "ex0903.f90"

logical alive

inquire(file=filename, exist=alive)

if(alive) then

write (*, *) filename, " exist."

else

write (*, *) filename, "doesn't exist."

end if

stop

edn program ex0903

详细介绍inquire的使用方法:

INQUIRE(UNIT=number, FILE=filename, IOSTAT=stat, ERR=label, EXIST=exist, OPENED=opened, NUMBER=number, NAMED=named, ACCESS=access, SEQUENTIAL=sequential, DIRECT=direct, FORM=form, FORMATTED=formatted, UNFORMATTED=unformatted, RECL=recl)

UNIT=number 文件代号

FILE=filename 文件名

IOSTAT=stat 查询文件读取情况,会设置一个整数给后面的变量:

stat>0 文件读取操作错误

stat=0 文件读取操作正常

stat<0 文件终了

ERR=errlabel 发生错误时会转移到复制的代码行继续执行程序。

EXIST=exist 检查文件是否存在,返回布尔变量,真表示存在,假值表示不存在。OPEND=opened 检查文件是否用已经用open打开,返回布尔变量,真表示已经打开,假表示尚未打开。

NUMBER=number 用文件名来查询这个文件所给定的代码。

NAMED=named 查询文件是否取了名字,也就是检查文件是否为临时保存盘,返回值为逻辑数。

ACCESS=access 检查文件的读取格式,返回一个字符串,可以是:

'SEQUENTIAL' 代表文件使用顺序读取格式

'DIRECT' 代表文件使用直接读取格式

'UNDEFINED' 代表没有定义

SEQUENTIAL=sequential 查看文件是否使用顺序格式,会返回一个字符串,可以是:

'YES' 代表文件是顺序读取文件

'NO' 代表文件不是顺序读取文件

'UNKNOWN' 代表不知道

DIRECT=direct 查看文件是否使用直接格式,会返回一个字符串,可以是:

'YES' 文件是直接读取文件

'NO' 文件是非直接读取文件

'UNKNOWN' 代表不知道

FORM=form 查看文件的保存方法,返回字符串,可以是:

'FORMATTED' 打开的是文本文件

'UNFORMATTED' 打开的是二进制文件

'UNDEFINED' 没有定义

FORMATTED=fmt 查看文件是否是文本文件,返回字符串,可以是:

'YES' 本文件是文本文件

'NO' 本文件非文本文件

'UNDEFINED' 无法判断

UNFORMATTED=fmt 查看文件是否是二进制文件,返回字符串,可以是:

'YES' 本文件是二进制文件

'NO' 本文件非二进制文件

'UNKNOWN' 无法判断

RECL=length 返回open文件时recl栏的设置值。

NEXTREC=nr 返回下一次文件读写的位置。

BLANK=blank 返回值是字符串,用来查看open文件时的blank参数所给定的字符串值。以下是fortran 90的添加功能:

POSITION=position 返回打开文件时position字段所给定的字符串, 可能是'REWIND',

'APPEND', 'ASIS', 'UNDEFINED'

ACTION=action 返回打开文件时action 字段所赋值的字符串,可能是'READ', 'WRITE',

'READWRITE'。

READ=read 返回字符串,检查文件是否为只读文件:

'YES' 文件是只读的

'NO' 文件不是只读的

'UNKNOWN' 无法判断

WRITE=write 返回一个字符串,检查文件是否可写入:

'YES' 文件可以写入

'NO' 文件不可以写入

'UNKNOWN' 无法判定

READWRITE=readwrite 返回一个字符串,检查文件是否可以同时读及写:

'YES' 文件可以同时读写

'NO' 文件不可以同时读写

'UNKNOWN' 无法判定

DELIM=delim 返回打开文件时,DELIM字段所设置的字符串,返回值可以是:

'APOSTROPHE', 'QUOTE', 'NONE', 'UNDEFINED'

PAD=pad 返回打开文件时PAD字段所设置的字符串,返回值可以是:'YES', 'NO'。

其他文件运行命令:

BACKSPACE(UNIT=number, ERR=errlabel, IOSTAT=iostat) 把文件读写位置退回一步。ENDFILE(UNNIT=number, ERR=errlabel, IOSTAT=iostat)使用这个命令会把目前文件的读写位置变成文件的结尾。

REWIND(UNIT=number, ERR=errlabel, IOSTAT=iostat)把文件的读写位置倒回到文件开头。CLOSE(UNIT=number, STATUS=string, ERR=errlabel, IOSTAT=) 把文件关闭,不要进行读写操作。

STAT='KEEP' 会在文件关闭后,保留这个文件。是默认状态。

STAT='DELETE' 在文件关闭后,消除这个文件。

-------------------------------------------

!程序结束时候会自动关闭文件,不过最好要养成自己关闭文件的习惯。

!在读文件的时候要懂得略掉一些没有必要的数据,如文件中的注释行。

!自由格式的数据文件读取(可以先读入前面的判断字符,结合select case或其他方法判断读入的数据)

!在open,read,write时使用不同的unit值,就可以打开多个文件。最好不要同时打开很多个文件。

顺序文件(SEQUENTIAL):在读写时,不能任意赋值到文件的某个位置读写数据,只能从开头开始一步步向下进行。在改变文件读写位置时,只能一步步地退,或是直接移回到文件开头。

直接访问文件:把文件的空间,内容,事先分区成好几个同样大小的小模块,这些模块会自动安顺序编号。读写文件时,要先赋值文件读写位置在第几个模块,再进行读写的工作。直接访问文件可以任意到文件的任何一个地方来读写。在使用直接访问文件时,要小心使用endfile命令,使用这个命令会把目前所在的文件位置之后的数据都清除掉。

二进制文件的操作:使用二进制文件来做直接读取时,open命令中的recl字段所设置的整数n值所代表的大小会随编译器不同而改变。每个编译器应该都可以经过设置来改变recl 字段的单位大小。二进制文件没有必要在数据之间用区分符号来增加文件的可读性,因为二进制文件本身就没有可读性。二进制文件是直接把内存的二进制数据写入文件,就没有所谓的格式化输入/出存在。存放“精确”及“大量”的数据时,使用二进制文件是比较好的选择。二进制文件也可以使用顺序格式来操作,顺序格式下显示来的二进制文件,每个数据的前后都会被编译器补上一些额外的信息,所生成的文件不太容易被其他程序读取。

关于以上文件操作详细见《fortran 95程序设计》9-3~9-5。

Internal File(内部文件)

使用写入文件的方法,把数据写到一个字符串变量中。

example:

a=2

b=3

character (len=20) :: string

write (unit=string, fmt="(I2,'+',I2,'=',I2)") a, b, a+b !把字符串变量当作输出的目的。

write(*, *) string

结果: 2+ 3= 5

还可以经过read命令从字符串读入数据:

integer :: a

character (len=20) :: string="123"

read(string, *) a

write(*, *) a

在某些情况下需要使用内部文件来设置数据:

使用read命令从键盘输入数据时,如果用户输入错误的数据,会导致死机。如需要输入整数时却输入英文字母,就可能会死机。比较好的处理办法是,程序先暂时把数据当作字符串读入,检查字符串中是否含有不合理的字符,如果字符串中都是0~9的数字字符,就把字符串转成整数,不然就请用户在输入一次。

内部文件还可应用在动态改变输出格式,输出格式可以事先存放在字符串中,程序进行时,动态改变字符串内容就可以改变输出格式。(见书P263)

NAMELIST:

NAMELIST是很特殊的输入/输出方法,收录在f90标准当中,f90中有统一NAMELIST的格式。

NAMELIST可以把一组相关变量封装在一起,输入/出这一组变量时,只要在write/read中的NML字段赋值使用哪一个NAMELIST就行了。

example:

program ex0918

implicit none

integer :: a = 1, b = 2, c= 3

namelist /na/ a,b,c

write(*,nml=na)

stop

end program ex0918

&NA

A = 1,

B = 2,

C = 3,

/

程序中把a,b,c这三个变量放在名字叫做na的namelist中。namelist也算是声明的一部分,必须编写在程序执行命令前面。

NAMELIST的语法很类似COMMON,不过使用namelist时一定要取名字:

namelist /nl_name/ var1, var2, ... !后面的变量会放在nl_name这个namelist 中。

封装好namelist后,在write的NML字段中指名要输出哪一个namelist,就可以把namelist 中的变量全部输出。

write(*,nml=na) !输出na这个namelist

输出namelist时候不能赋值输出格式,f90标准中规定输出namelist时首先会输出符号&,后面紧接着这个namelist的名字。接着会根据顺序输出变量的名称,等号以及内容,变量之间用空格或逗号来做分隔,最后使用除号来作结束。

至于每个数值内容会使用何种格式输出由编译器自行决定。

NAMELIST也可以用来输入数据,不过通常都会用来读取文件,不会用在键盘输入。输入格式需要按照前面的格式。&na ....../ 不需要按照变量顺序输入,程序会自动按照变量名称来设置数值。变量甚至可以重复输入,不过变量会得到最后一次设置的数值。

namelist通常使用在文本文件的输入/输出中,使用read从文件中读取数据时,会自动从目前的位置向下寻找存放namelist的地方。

example:

program ex0920

implicit none

integer :: a(3)

namelist /na/ a

open(10, file="ex0920.txt")

read(10, nml=na)

write(*, "(3I2)") a

stop

end program

输入文件的内容如下:

happy birthday

&na a = 1,2,3/

程序打开时,读写位置在文件的开头,read命令会自动向下寻找na这个namelist的存放位置来读取数据,这边可以看到namelist处理数组的方法,它会在等号后面根据顺序显示

数组内容。

fortran文件读取技巧

最近专业课海洋要素计算作业需要用fortran编程读取验潮站资料(如下,是txt,其中数据是有62行,限于篇幅,我只截取了前5行数据外加验潮站的4行头信息) !要注意的是最后一列数据后面没有空格 program ex1 !********************************************** !* written by 潘海东, 2015,3,20 !*一次性读取744个数据,放入一维数组中 !*(如果一次性读取太多的话可能会对系统造成某些影响) !********************************************** INTEGER :: b(62*12),i character(len=20) time,location,u1,u2 open(10, file = 'C:\Users\Administrator\Desktop\sjs_t_97aug_m(harmonic).txt', status = 'old') !********读取头信息 read(10,"(A3)") u1 read(10,"(A18)") time read(10,"(A13)") location read(10,"(A2)") u2 !********读取数据 read(10,100) b(:) 100 format(61(11(I4,1x),I4,/),11(I4,1x),I4) !在fortran的输入输出中'/'代表换行 close(10) end program ex2 !********************************************** !* written by 潘海东, 2015,3,20 !*读取第3列至第11列 !********************************************** INTEGER :: a(62,9),i character(len=20) time,location,u1,u2 open(10, file = 'C:\Users\Administrator\Desktop\sjs_t_97aug_m(harmonic).txt', status = 'old') !***读取头信息

fortran心得

Read 的规则: 按行读取,每次读一行,读完后光标自动跳到下一行的开头,空格和逗号代表结束(所以空格和逗号也是读取的一部分的话,需要使用“输入输出格式”) 如果想要将一行数据读入数组,代码为: Read(10,*) s(:,:,:) 不用规定输入输出格式,因为会根据s(:,:,:)确定需要读入的数字的个数,然后fortran会按部就班的读取,甚至文件中当前这一行的数字个数不足以填满s(:,:,:)的时候,read会自动跳到下一行继续搜索数字,直到填满s(:,:,:)为止。 但是需要注意给数组赋值的顺序:read会把它搜索到的第一个数字给s(1,1,1),第二个给s(2,1,1),第三个给s(3,1,1)… 程序9 1: 将read(unit=field,fmt="(A79)",iostat=status)buffer 中的A79改为A2,结果只输出每行的前两个字符,说明read是按整行整行读取的。 中间空了几行之后,空行之后的内容还是能被读取和输出,这说明,空行和空白是不一样的:空行也算是一种文本内容,因此不会终止读取,而空白意味着结束。 !读取文件 program main implicit none character(len=79)::filename="number.txt",buffer integer,parameter::field=10 integer::status=0 logical alive inquire(file=filename,exist=alive) if(alive)then open(unit=field,file=filename) do while(.true.) read(unit=field,fmt="(A79)",iostat=status)buffer if(status/=0)exit write(*,"(A79)")buffer end do else write(*,*)filename,"does't exist." end if pause stop end program main ============================================= 附number.txt =============================== 1234555666

Fortran进行批处理地方法

Fortran中批量处理文件的方法总结 —循环读取目录下的所有符合条件的文件===================== 一、简单的介绍 在一年之前,我写过一个程序,主要是对Micaps资料进行批量处理,将逐日资料处理为旬、月的数据,在那个程序中,始终有一个问题困扰我,就是如何自动生成该读取的下一个文件名,这使我真正开始关注fortran中的批处理,时隔一年,决定写下这些文字,将我用到的一些fortran批处理的方法和大家共享,交流。 对于那些只要会用程序,不求其中原理的朋友,请马上跳过这些文字,直接去下载附件吧!程序里有使用说明,但是,如果你不懂原理,估计现成的程序你使用起来也会碰壁哦! 这里所说的批处理是指对某一个目录下的指定后缀的文件的批量读取和处理。 我总结的批处理方法大概可以用下面这个示意图来说明: | | |将文件目录写入一个文本文件,供fortran循环读取 |————手动输入文件名 |————运行程序之前命令行工具导出文件名 |————程序运行后,未开始计算之前,生成文件名 | ————调用CMD命令生成 | ————GETFILEINFOQQ方法生成 | ————调用WIN32API生成 | |在程序运行时动态生成文件名 | | 对于第一种方法,我将主要介绍如何将目录写入文件,然后举出一个小的示例来验证。第二种方法主要是说明其思路。 二、方法的介绍 1、将文件目录写入一个文本文件,供fortran循环读取 1.1、手动输入文件名 这是最基本的方法啦,如果文件个数不多,而且文件名中包含了空格等特殊字符的话,建议使用这种方法,在这里就不多说啦,至于在fortran中的处理,等几个小方法介绍完之后会有一个例子来说明。

fortran新建,添加外部文件和简要读写格式说明

1.建立新的运行空间 File>new>workspace>new>prject>console application>new>file>free-form 2.建立多个文件 可以把子程序文件和主程序文件放在同一个source文件下 3.建立外部文件用于读写数据 Open(1,file=’ exam.txt ‘)用于打开文件,其中1为设备号——用一整数表示,exam.txt为要打开的文件名,文件有文件名和文件类型构成,文件名可给出路径如file=’ D:\exam\exam.txt ‘Write(1,*)’学生的成绩为:’用于在写在前面打开的1文件里写数据,其中*和0、5、6是系统预定义的设备号由系统隐含规定。一个文件名只能和一个设备号建立联系,同样一个设备号也只能与一个文件建立联系,一个通过OPEN语句打开并指定了设备号的文件不能再次用OPEN语句打开 Read(1,*)表示从文件里面读取数据,一次读取一个数据,数据间用逗号隔开 每隔一个read语句或write语句默认的换一行读入或写入 Write(1,”(‘输入’)”)=write(1,*) ‘输入’ Write(1,”(‘I3,’输出’,I7)”) x,y结果是x以3个整型字符输出,输出,y以7个整型输出 Read(1,100)或write(1,100)I,j,k 100 format(I3,I7,F6)表示按照100语句的格式读入或输出顺序读写数据: Read(uint设备号,fmt格式说明,end结束语句转移,eor错误语句转移) 输入数据可以按规定的域宽输入,也可以用逗号强制间隔, 1.使用read语句读取数据时,read语句输入表中的数据类型和格式应该与当前指针位置 数据类型和格式一致。 2.使用read语句读取数据时,从当前文件指针开始读取,完成读取后文件指针自动后移一 个记录,使用OPEN和REWIND语句时,文件指针指向第一个记录,从第一个记录开始读取。 3.使用read语句读取时,如果输入表要求输入的数据少于当前记录的数据个数,则多余的 数据将被忽略,下一个read语句从下一个新的记录开始读取数据。相反则继续读取下条数据记录直到读完全部输入数据。 4.使用write语句时,从当前文件指针开始存写,完成存写后文件指针自动后移一个记录, 使用OPEN和REWIND语句时,文件指针指向第一个记录,从第一个记录开始读取。如果文件已存在,则原文件的数据将丢失。 5.使用write语句写入数据时,从当前的位置开始写入,可使用format语句中的格式说明 及括号和反斜杠/创建多条新纪录写入,完成操作后,文件指针自动后移一个记录。6.使用了read以后,立即使用write语句,将导致写入的数据为最后一个记录,其余的数 据将丢失。如果在文件末尾要写入新的记录可以通过下了语句实现: 100 read(1,*,end=200) Goto 100 200 write(1,*)’’ 7.使用了write语句立即使用read语句会遇到一个文件结束标志。如果写入后要立即进行 读取,需要用OPEN、rewind、backspace等对文件重新定位。 文件打开操作: Open(unit=设备号,file=文件名,access=存取方式,form=存取格式,recl=记录长度,err=错误转移,pad=补加空格,position=读取位置) 如err=100,表示跳到100号语句 Position 为文件位置包括三个格式,ASIS,已存在文件的上一次操作位置为文件的位置,缺

fortran文件操作

fortran文件操作 From: 《Fortran 95 程序设计》彭国伦 1.文件读取的概念: 读取:“顺序读取”和“直接读取”。 保存:“文本文件”和“二进制文件”。 二进制文件:读取快,因为保存格式和数据在内存中的保存方法一样,同时也节省空间。 ---------------------------------- 2. 文件的操作: ---------------------------------- open的使用:使用open命令打开文件之后,就可以对文件来做输入输出。 example: program ex0901 impicit none open(unit=10, file='hello.txt') ! 打开hello.txt文件, unit指定文件代码,file 指定文件名称。 write(10, *) "hello" !在代码为10的文件中写入hello stop end program ex0901 open中有很多参数可以使用,详细如下: OPEN(UNIT=number, FILE='filename', FORM='...', STATUS='...', ACCESS='...', RECL=length, ERR=label, IOSTAT=iostat, BLANK='...', POSITION='...', ACTION=action, PAD='...', DELIM='...') UNIT='number': number必须是一个正整数,它可以使用变量或是常量来赋值。number最好避开1,2,5,6。因为2,6是默认的输出位置,也就是屏幕。1,5则是默认的输入位置,键盘。 FILE='filename':指定要打开的文件名称,文件名要符合系统规定。windows下不区分大小写,unix下则会区分大小写,最好不要使用中文文件名。 FORM='FORMATTED' OR 'UNFORMATTED' FORM字段只有两个值可以设置: FORM='FORMATTED' “文本文件”格式来保存 FORM='UNFORMATTED' “二进制文件”格式保存 这一栏不给定时候的默认值是: FORM='FORMATTED' STATUS='NEW' or 'OLD' or 'SCRATCH' or 'UNKNOWN' 用来说明打开一个新的文件或已经存在的旧文件。 STATUS='NEW' 打开一个原本不存在的新文件 STATUS='OLD' 打开一个原来已经存在的文件 STATUS='REPLACE' 若文件已经存在则重新创建一次,原来的内容消失;若不存在则会创建新文件。 STATUS='SCRATCH' 表示要打开一个暂存文盘,这个时候可以不需要指定文件名称,也就是FILE这个一栏可以忽略。因为程序本身会自动取一个文件名,至于文件名是啥也不重要,因为暂存盘会在程序结束后自动删除。 STATUS='UNKNOWN' 由各编译器自定义。通常会同REPLACE的效果。 !这一栏不给定时,默认为STATUS='UNKNOWN'。 ACCESS='SEQUENTIAL' or 'DIRECT' 设置读写文件的方法:

FORTRAN新建,添加外部文件和简要读写格式说明

1.建立新的运行空间 File>new>workspace>new>prject>console application>new>file>free-form 2.建立多个文件 可以把子程序文件和主程序文件放在同一个source文件下 3.建立外部文件用于读写数据 Open(1,file=’ exam.txt ‘)用于打开文件,其中1为设备号——用一整数表示,exam.txt 为要打开的文件名,文件有文件名和文件类型构成,文件名可给出路径如file=’D:\exam\exam.txt ‘ Write(1,*)’学生的成绩为:’用于在写在前面打开的1文件里写数据,其中*和0、5、6是系统预定义的设备号由系统隐含规定。一个文件名只能和一个设备号建立联系,同样一个设备号也只能与一个文件建立联系,一个通过OPEN语句打开并指定了设备号的文件不能再次用OPEN语句打开 Read(1,*)表示从文件里面读取数据,一次读取一个数据,数据间用逗号隔开 每隔一个read语句或write语句默认的换一行读入或写入 Write(1,”(‘输入’)”)=write(1,*) ‘输入’ Write(1,”(‘I3,’输出’,I7)”) x,y结果是x以3个整型字符输出,输出,y以7个整型输出 Read(1,100)或write(1,100)I,j,k 100 format(I3,I7,F6)表示按照100语句的格式读入或输出顺序读写数据: Read(uint设备号,fmt格式说明,end结束语句转移,eor错误语句转移) 输入数据可以按规定的域宽输入,也可以用逗号强制间隔, 1. 使用read语句读取数据时,read语句输入表中的数据类型和格式应该与当前指针位置 数据类型和格式一致。 2. 使用read语句读取数据时,从当前文件指针开始读取,完成读取后文件指针自动后移一个记录,使用OPEN和REWIND语句时,文件指针指向第一个记录,从第一个记录开始读取。 3. 使用read语句读取时,如果输入表要求输入的数据少于当前记录的数据个数,则多余的数据将被忽略,下一个read语句从下一个新的记录开始读取数据。相反则继续读取下条数据记录直到读完全部输入数据。 4. 使用write语句时,从当前文件指针开始存写,完成存写后文件指针自动后移一个记录,使用OPEN和REWIND语句时,文件指针指向第一个记录,从第一个记录开始读取。如果文件已存在,则原文件的数据将丢失。 5. 使用write语句写入数据时,从当前的位置开始写入,可使用format语句中的格式说明及括号和反斜杠/创建多条新纪录写入,完成操作后,文件指针自动后移一个记录。 6. 使用了read以后,立即使用write语句,将导致写入的数据为最后一个记录,其余的数据将丢失。如果在文件末尾要写入新的记录可以通过下了语句实现: 100 read(1,*,end=200) Goto 100 200 write(1,*)’’ 7. 使用了write语句立即使用read语句会遇到一个文件结束标志。如果写入后要立即进行读取,需要用OPEN、rewind、backspace等对文件重新定位。 文件打开操作: Open(unit=设备号,file=文件名,access=存取方式,form=存取格式,recl=记录长度,err=错误转移,pad=补加空格,position=读取位置) 如err=100,表示跳到 100号语句

Fortran学习总结

1、用结构体读取二进制文件存在的问题及解决方案 在讲这个问题之前,我们先看一段代码: 01 program fcode_cn 02 integer(4)::i=1,j=2,k=3 03 character::ch*2='cn' 04 type head 05 !sequence 06 character*2ch 07 integer(4)i,j,k 08 end type 09 type(head)he 10 11 open(11,file='11.txt',access='stream') 12 write(11)ch,i,j,k 13 close(11) 14 ! 方法1 15 open(11,file='11.txt',access='stream') 16 read(11)he.ch,he.i,he.j,he.k 17 close(11) 18 print*,he 19 ! 方法2 20 open(11,file='11.txt',access='stream') 21 read(11)he 22 close(11) 23 print*,he 24 pause 25 end 代码开头先向文件11.txt中写入一个字符串”cn”和3个4字节整数1, 2, 3 ,然后分别使用方法1和方法2读取并输出数据。 从代码本身分析,我们向文件中写入了14个字节的信息,方法1和方法2均用结构体去读取这个14字节信息。理论上说,这不存在问题,但是在执行时,我们遇到下面的错误(图1):

读取同样的数据为什么方法1能够正确执行,而方法2却遇到文件尾呢?这跟结构体元素的对齐方式有关。 打开项目属性-Fortran-data,点开structure member alignment选项(如图2),查看对齐方式,有1字节、2字节、4字节、8字节和16字节,win32系统缺省为4字节。 现在我们来解释上面出现的错误。由于win32系统缺省对齐方式为4字节,在使用方法2进行文件读取的时候,每次从文件中读取4字节数据,依次赋值给变量ch, i, j, k。因此需要读取4×4=16字节信息,但文件中仅有14字节信息,故出现如上错误。 为避免以上错误: 一是采用方法1进行读取,但如果结构体太复杂,比如为SEGY数据道头时,这种方法不可取; 二是将structure member alignment选项设置为1字节,这依赖于编译器设置,可移植性较差。 我们推荐另一种解决方案,即在结构体定义部分加上sequence指令: type head sequence character*2 ch integer(4) i,j,k

Fortran产生序列文件名

Fortran字符串操作备忘录——产生序列文件名 主程序:根据一个前缀字符串、一个序列号,生成一个文件名。 函数1:根据一个字符串、串定义长度,计算该串非空字符的首个位置。 函数2:根据一个字符串、串定义长度、非空字符的首个位置,计算该串非空字符的未尾位置。 cccccccccccccccccccccccccccccccccccccccccc Main Program program test cccc Just to make string with prefix Name cccc and serial Num parameter(lengthStr=80,lengthNum =5) character(len=lengthStr)::str character(len=lengthNum)::num character(len=lengthStr)::preName integer i,baseNum integer loca1Pre,loca2Pre integer loca1Num,loca2Num integer loca1Str,loca2Str ccccccccccccccccccccccccc make subString : prefix Name preName='file' loca1Pre = loca1(preName,lengthStr) loca2Pre = loca2(preName,lengthStr,loca1Pre) write(*,*)'preName (',loca1Pre,':',loca2Pre, + ') = ', preName(loca1Pre:loca2Pre) baseNum = 1000 !为整型数值转换为长度相同(3位)的字符串而准备 cccccccccccccccccccccccc do i=1,10 cccc make subString : serial Num write(num,*)baseNum + i !统一整型数的位数,将1变为1001,转字符串类型 loca1Num = loca1(num,lengthNum)+1 !非空字符的首个位置向后移动一位,将1001变为001 loca2Num = loca2(num,lengthNum, loca1Num) cccc make final String !前缀_SerialNum.txt str = preName(loca1Pre:loca2Pre)//'_' + //num(loca1Num:loca2Num)//'.txt' loca1Str = loca1(str,lengthStr) loca2Str = loca2(str,lengthStr, loca1Str) cccc write(*,*)'i=',i,', num=',num,', num(',loca1Num,':',loca2Num, + ')=',num(loca1Num:loca2Num) , + ', str(',loca1Str,':',loca2Str, + ' )= ', str(loca1Str:loca2Str),'.'

FORTRAN读取未格式化二进制文件

FORTRAN · 2003 4 C/C++ FORTRAN FORTRAN …… FORTRAN “a” 4 open(60,file=filename,status=’unknow’,form=’unformatted’) write(60) nx,ny,nz do k=1,nz do j=1,ny write(60) (a(i,j,k),i=1,nx) enddo enddo close(60) (4*nx)*ny*nz+12 nz*ny*(4*nx+8)+20 FORTRAN “ ” 4 4 4 4 write(60) nx,ny,nz nx,ny,nz 4 2 0 12 nx ny nz 0 12 20(2+2+4+4+4+2+2) write(60) (a(i,j,k),i=1,nx) nx 1024 0 4096 a(1,j,k) a(2,j,k) ……a(1024,j,k) 0 4096 4104(2+2+4+4+……+4+2+2) C/C++ open(60,file=filename,status=’unknow’,form=’unformatted’)

write(60) nx,ny,nz do k=1,nz do j=1,ny do i=1,nx write(60)a(i,j,k) enddo enddo enddo close(60) a 4 12 nx*ny*nz*12+20 FORTRAN FORTRAN “ ” #define SWAP_2(x) ( (((x) & 0xff) << 8) | ((unsigned short) (x) >> 8) ) #define SWAP_4(x) ( ((x) << 24 | (((x) << 8) & 0x00ff0000 | (((x) >> 8) & 0x0000ff00) | ((x) >> 24) ) #define FIX_SHORT(x) (*(unsigned short *)&(x) = SWAP_2(*(unsigned short * )&(x))) #define FIX_LONG(x) (*(unsigned *)&(x) = SWAP_4(*(unsigned *)&(x))) #define FIX_FLOAT(x) FIX_LONG(x) 4 / ASCII 2008 1 64 2 4 2 FORTRAN access=’stream’

将主文件等分为m个子文件(fortran代码)

!将包含n个数据的文件等分为m个子文件PROGRAM FILES character20 filename !输入主文件名 print,'input data_file' read(,)filename !输入要拆出的文件个数 print,'input the number of sub_data_file' read(,)m !查看数据文件中的数据个数 call getnumber(filename,n) !将数据文件等分 call sepfile(filename,n,m) !合并文件 ENDPROGRAM subroutine getnumber(filename,n) character20 filename character5 aa open(1,file=filename,action='read') n=0 do read(1,,end=100)aa n=n+1 enddo 100 close(1) endsubroutine subroutine sepfile(filename,n,m) character20 filename,str character80 temp open(1,file=filename,action='read') do i=1,m write(str,(i3.3)) i !!将i转换为字符串str str(47)='.dat' open(2,file=trim(str),action='write') do j=1,nm read(1,)temp write(2,)trim(temp) enddo close(2) enddo close(1) endsubroutine

fortran文件操作open

1.文件读取的概念: 读取:“顺序读取”和“直接读取”。 保存:“文本文件”和“二进制文件”。 二进制文件:读取快,因为保存格式和数据在内存中的保存方法一样,同时也节省空间。 ---------------------------------- 2. 文件的操作: ---------------------------------- open的使用:使用open命令打开文件之后,就可以对文件来做输入输出。 example: program ex0901 impicit none open(unit=10, file='hello.txt') ! 打开hello.txt文件, unit指定文件代码,file指定文件名称。 write(10, *) "hello" !在代码为10的文件中写入hello stop end program ex0901

open中有很多参数可以使用,详细如下: OPEN(UNIT=number, FILE='filename', FORM='...', STATUS='...', ACCESS='...', RECL=length, ERR=label, IOSTAT=iostat, BLANK='...', POSITION='...', ACTION=action, PAD='...', DELIM='...') UNIT='number':number必须是一个正整数,它可以使用变量或是常量来赋值。number最好避开1,2,5,6。因为2,6是默认的输出位置,也就是屏幕。1,5则是默认的输入位置,键盘。 FILE='filename':指定要打开的文件名称,文件名要符合系统规定。windows下不区分大小写,unix下则会区分大小写,最好不要使用中文文件名。 FORM='FORMATTED' OR 'UNFORMATTED' FORM字段只有两个值可以设置: FORM='FORMATTED' “文本文件”格式来保存 FORM='UNFORMATTED' “二进制文件”格式保存 这一栏不给定时候的默认值是: FORM='FORMATTED' STATUS='NEW' or 'OLD' or 'SCRATCH' or 'UNKNOWN' 用来说明打开一个新的文件或已经存在的旧文件。

(完整版)fortran函数总结,推荐文档

附录C SCILAB 部分函数指令表 (c)LIAMA. All rights reserved. (注解:本指令表只收集了部分常用指令, 有关全部指令请参照文档文件) + 加 - 减 * 矩阵乘 数组乘 *. 1. 通用指令 ^ 矩阵乘方 数组乘方 ^. \ 反斜杠或左除 help 在线帮助 / 斜杠或右除 apropos 文档中关键词搜寻 或.\ 数组除/. ans 缺省变量名以及最新表达式的运 算结果 == 等号 ~= 不等号 clear 从内存中清除变量和函数 < 小于 exit 关闭SCILAB > 大于 quit 退出SCILAB <= 小于或等于 save 把内存变量存入磁盘 >= 大于或等于 exec 运行脚本文件 &,and 逻辑与 mode 文件运行中的显示格式 |,or 逻辑或 getversion 显示SCILAB 版本 ~,not 逻辑非 ieee 浮点运算溢出显示模式选择 : 冒号 who 列出工作内存中的变量名 ( ) 园括号 edit 文件编辑器 [ ] 方括号 type 变量类型 { } 花括号 what 列出SCILAB 基本命令 小数点 . format 设置数据输出格式

, 逗号 chdir 改变当前工作目录 ; 分号 getenv 给出环境值 // 注释号 mkdir 创建目录 = 赋值符号 pwd 显示当前工作目录 ' 引号 evstr 执行表达式 ' 复数转置号 转置号 '. ans 最新表达式的运算结果 2.运算符和特殊算符%eps 浮点误差容限, =2 -52 ≈ 2.22×10 -16 %i 虚数单位= √(-1) %inf 正无穷大 %pi 圆周率, π=3.1415926535897.... 3. 编程语言结构 abort 中止计算或循环 break 终止最内循环 case 同select 一起使用 continue 将控制转交给外层的for或 while循环 else 同if一起使用 elseif 同if一起使用 end 结束for,while,if 语句 for 按规定次数重复执行语句 if 条件执行语句 otherwise 可同switch 一起使用 pause 暂停模式 return 返回 select 多个条件分支 then 同if一起使用 while 不确定次数重复执行语句 eval 特定值计算 feval 函数特定值计算或多变量计算 function 函数文件头 global 定义全局变量

Fortran 批量处理文件

Fortran 批量处理文件 程序中需要读取或处理大量文件的时候,在代码中写入大量的open语句就显得很笨重,如果文件很多(比如有1000个文件),这种方法根本不可行。针对这种情况,介绍两种解决方法。 方法一: 考虑如下情形:假设存在100个文件,分别存储了1900-1999年的降雨量,现在需要计算着100年的总降雨量。文件名为:前缀+年份+后缀,例如:降雨量-1900.dat、降雨量-1901.dat 。由于文件名是有规律的,仅年份变化,可以用循环来一次读取文件。 program test integer i real s, a character(20):: filename='降雨量-1234.dat' s = 0.0 do i=1900, 1999 !内部文件读写,将filename第8-11字符换为相应年份 write(filename(8:11),'(i4)') i open(11,file=filename) read(11,*) a close(11) s = s + a end do end program 这种方法优点是可以按顺序读取文件,缺陷也很明显,只能处理有规律的文件名。

方法二: 如果文件名没有规律,使用另一种方法。先用命令行指令将需要处理的文件的文件名写入另外一个文件当中: call system ('dir *.txt /b > 1.dat' ) 上述代码含义:找出工作目录下所有txt文件,将其文件名存入1.dat当中,注意二者的后缀不应相同(txt, dat)。为了避免错误,需要事先删除无用的txt文件。修改命令行指令,可以找出任意符合条件的文件,比如找出上例中存储降雨量的文件: call system ('dir 降雨量-*.dat /b > 1.txt' ) 完整代码如下: program test integer i real s, a character(512):: filename !文件1.dat中存储工作目录下所有txt文件列表 call system ('dir *.txt /b > 1.dat' ) s = 0.0 open(10,file='1.dat') do !读取文件名 read(10,'(a)',iostat=i) filename if(i/=0) exit open(11,file=filename) read(11,*) a close(11) s = s + a end do close(10,status='delete') !关闭并删除文件1.dat end program 方法二优点是不要求文件名称有很强规律性,缺点是处理每个文件的顺序是未知的。如果文件个数不多,且需要按顺序处理,可以手动生成文件列表。 来自:Fortran初学(100125753)QQ群

Fortran 二进制文件读写

Fortran 二进制文件读写【给新手】 2008-05-17 11:43:18| 分类:胡说八道|字号订阅 一些朋友总是咨询关于二进制文件的读写和转化。这里就我自己的理解说一说。 一).一般问题 二进制文件与我们通常使用的文本文件储存方式有根本的不同。这样的不同很难用言语表达,自己亲自看一看,理解起来会容易得多。因此,我推荐学习二进制文件读写的朋友安装一款十六进制编辑器。这样的编辑器有很多,在我们的 CVF 附带的集成开发环境下就可以(将二进制文件拖动到 IDE 窗口后松开)。Visual Studio 2005 也是可以的。(不过需要在 File 菜单下 Open,File) 另外推荐一款使用较多的软件,叫做 UltraEdit(以下简称 UE)。是很不错的文本编辑器,也能做十六进制编辑器使用。 为什么要用十六进制编辑器?而不用 2 进制呢?因为 2 进制实在太小,书写起来会很长,很不直观。而我们的计算机把 8 位作为一个字节。刚好2 ** 8 = 256 = 16 ** 2。用 8 位 2 进制表达的数,我们用 2 个十六进制数据来表达,更直观和方便。 二).文件格式 所有文件,笼统意义上将可以区分为两类,一类是文本文件,一类是二进制文件。 1).文本文件 文本文件用记事本等文本编辑器打开,我们可以看懂上面的信息。所以使用比较广泛。通常一个文本文件分为很多很多行,作为数据储存时,还有列的概念。实际上,储存在硬盘或其他介质上,文件内容是线一样储存的,列是用空格或 Tab 间隔,行是用回车和换行符间隔。 以 ANSI 编码(使用较多)的文本文件来说,例如我们储存如下信息: 10 11 12 需要的空间是:3 行 × 每行 2 个字符 + 2 个回车符 + 2 个换行符 = 10 字节。文本文件储存数据是有格式,无数据类型的。比如 10 这个数据,并不指定是整型还是实型还是字符串。它有长度,就是2,两个字节。储存时计算机储存它的 ASCII 码:31h,30h。(十六进制表示)。回车符是:0Dh,换行符:0Ah。 因此,这个数据储存是这样的: 31 30 0D 0A 31 31 0D 0A 31 32 (红色为回车符和换行符) 31h 30h 就是 10,31h 31h 就是 11,31h 32h 就是 12。因此我们也可以认为文本文件是特殊的二进制文件。

Fortran读取二进制文件

一).一般问题 二进制文件与我们通常使用的文本文件储存方式有根本的不同。这样的不同很难用言语表达,自己亲自看一看,理解起来会容易得多。因此,我推荐学习二进制文件读写的朋友安装一款十六进制编辑器。这样的编辑器有很多,在我们的 CVF 附带的集成开发环境下就可以(将二进制文件拖动到 IDE 窗口后松开)。Visual Studio 2005 也是可以的。(不过需要在 File 菜单下 Open,File) 另外推荐一款使用较多的软件,叫做 UltraEdit(以下简称 UE)。是很不错的文本编辑器,也能做十六进制编辑器使用。 为什么要用十六进制编辑器?而不用 2 进制呢?因为 2 进制实在太小,书写起来会很长,很不直观。而我们的计算机把 8 位作为一个字节。刚好 2 ** 8 = 256 = 16 ** 2。用 8 位 2 进制表达的数,我们用 2 个十六进制数据来表达,更直观和方便。 二).文件格式 所有文件,笼统意义上将可以区分为两类,一类是文本文件,一类是二进制文件。 1).文本文件 文本文件用记事本等文本编辑器打开,我们可以看懂上面的信息。所以使用比较广泛。通常一个文本文件分为很多很多行,作为数据储存时,还有列的概念。实际上,储存在硬盘或其他介质上,文件内容是线一样储存的,列是用空格或 Tab 间隔,行是用回车和换行符间隔。 以 ANSI 编码(使用较多)的文本文件来说,例如我们储存如下信息: 引用: 10 11 12 需要的空间是:3 行 ×每行 2 个字符 + 2 个回车符 + 2 个换行符 = 10 字节。文本文件储存数据是有格式,无数据类型的。比如 10 这个数据,并不指定是整型还是实型还是字符串。它有长度,就是 2,两个字节。储存时计算机储存它的 ASCII 码:31h,30h。(十六进制表示)。回车符是:0Dh,换行符:0Ah。因此,这个数据储存是这样的: 引用: 31 30 0D 0A 31 31 0D 0A 31 32

C语言直接操作FORTRAN数据文件的方法

C语言直接操作FORTRAN数据文件的方法 张云如 摘要:FORTRAN数据文件的结构及用C语言直接对FORTRAN数据文件进行数据读取和处理的方法,并结合实例,给出了完成操作的C语言源程序。 关键词:C语言FORTRAN数据文件数据直接读写 FORTRAN语言适用于数值计算,在科学和工程计算方面发挥了重要作用。C语言具有很强的通用程序设计功能,而且很适于处理图形图像、系统程序方面的问题,但它的数值计算能力不如FORTRAN语言。如果能在C语言程序中直接调用FORTRAN程序的计算结果,则可充分利用这2种语言的优势。为此,有必要建立用C语言对FORTRAN数据文件进行直接读取和处理的方法。 1 FORTRAN数据文件的结构 在C语言程序中调用FORTRAN程序的计算结果,可通过FORTRAN数据文件来实现,而要用C语言直接存取FORTRAN数据文件,必须首先清楚FORTRAN数据文件的结构。 FORTRAN数据文件按存取方式的不同可分为顺序文件和直接文件。而不论是顺序文件还是直接文件,按数据在文件中的存放方式的不同,都有2种存放形式,一种是字符形式(即ASCII码形式),另一种是二进制代码形式。前者称为有格式存放,后者称为无格式存放。由于对直接文件存取的基本操作步骤与对顺序文件存取的基本操作步骤相同,二者的不同主要体现在操作时是否应顺序进行。下面以顺序文件为例进行具体分析。 1.1 有格式文件的结构 有格式文件全部由有格式的记录组成,有格式的记录是字符的序列,以ASCII码形式存放。各记录以回车符(0DH)和换行符(0AH)作为结束标志,各记录之间无分隔符,各记录的长度(字节数)可以不等。 1.2 无格式文件的结构 无格式文件全部由无格式记录组成,无格式记录是值的序列,即二进制代码序列。这种格式的文件,其第1个字节是4BH(即十进制的75),最后1个字节为82H(即十进制的130),各无格式记录的数据信息位于这2个字节之间。 每一个无格式记录都由下面3部分组成:(1)记录的首字节,是该记录所有数据所占的字节数;(2)组成该记录的各数据内容。不论是整型数据还是实型数据,每个数据均占4个字节,其中整型数据只占4个字节中的前2个字节(低字节在前),而后面的2个字节为空(20H)。各数据之间不空格。(3)每个无格式记录的末字节,又是该记录的字节数,而不是以回车换行符作为结束标志。各记录之间也没有分隔符。 2 用C语言直接操作FORTRAN数据文件的方法 2.1 直接读取FORTRAN数据文件 由于有格式文件是ASCII文件,因而用C语言读取它时,只要用“r”方式打开它,便可逐字符读取该文件中的数据,直至遇到文件结束标志为止。 用C语言读取无格式文件时,一般先用“rb”方式打开它,然后用fseek函数将文件指针定位到第2个字节处,先读取第1个无格式记录的字节数(它一定为4的倍数),然后自第3个字节开始,每次用fread 函数(不能用fscanf函数)读取4个字节,便可将该无格式记录中的数据逐个读出,直至达到第1个无格式记录的字节数。若要读取第2个无格式记录中的诸数据,可在读完第1个记录之后(此时,文件指针已定位于第1个字节的末字节处),将文件指针再前移1个字节,先从该字节读出第2个记录的字节数,之后的操作便与读取第1个记录的相同。其余记录的读取可依此类推。 在创建FORTRAN无格式文件时,如果将整数写成同值的实数,则在用fread函数读取时,可免去进行所读数据是整数还是实数的判断,而又不影响数据值的大小。

Fortran基本介绍

基于Fortran的AspenPlus单元过程用户模型的开发基础知识 Aspen Plus是一种通用的化工过程模拟、优化和设计软件,但它提供的通用过程单元模型并不能满足用户的所有需求,如反应器,并不能把所有的反应及反应本质模拟出来。但是Aspen Plus提供了用户扩展接口,用户可以根据自己的需要将自定义的过程单元模型添加到该软件中并使用。Aspen Plus提供了基于Fortran用户模型的开发方式,即可以编写Fortran用户子程序,编译后产生一个动态连接库,从而实现用户模型和Aspen Plus的结合。 用户模型是一黑箱模型,内部程序可是根据需要自己定义,输入物流可以在Stream中先定义,将流股信息(如温度、压力、组成及流量等)按照Aspen Plus的内部规定传递到模型中,参与模型的内部计算;然后将模型计算的结果通过输出物流信息传递出来,用户可以根据自己的需要来定义,但必须要遵守Aspen Plus的内部规定。 由于外部Fortran子程序不能被解释,需要一个Fortran编译器。不同版本的Aspen Plus软件需要不同版本的Fortran编译器,如Aspen Plus 11.1只需要Visual Fortran 6.0版本即可;Aspen Plus 2006就需要Intel Fortran 9.0版本,且必须在Microsoft Visual https://www.360docs.net/doc/577661081.html,环境下,在Aspen Plus Simulation Engine上编译,编译成功后生成用户模型的目标模块文件(*.obj)或共享库(*.dll)。产生的目标模块文件(*.obj)若能正常链接和求解,运行Aspen Plus的电脑上必须安装Intel Fortran Compiler和Microsoft Visual Studio .NET 2003(或2000)这类的大程序,这样就占据了大量的电脑空间。当产生共享库(*.dll)后,和Aspen Plus文件放在一个文件夹,并在装载和求解用户模型的DLOPT文件中指定路经,就可以直接运行内嵌用户模型的Aspen Plus文件了。 FORTRAN一般用于建立aspen用户模型。 根据ASPEN关于用户模型的说明书,建立并引用用户模型的步骤包括: 1.用FORTRAN写一个用户模型 2.使用aspcomp命令编译用户模型 3.使用asplink命令(可选的)把用户模型链接到共享库中 4.为Aspen Plus系统提供目标文件或共享库。 其中编写用户模型根据FORTRAN规则,Aspen对文件名,子程序名,精度等也有一些规定。例如,文件可以给定任意名,但应该以.f为扩展名。所有实型变量必须声明为双精度,在子程序中应包括下列语句: IMPLICIT REAL*8(A-H,O-Z) 其他还有一些,可以参考aspen用户手册。 在运行ASPEN PLUS前,必须编译所有的Fortran用户模型。进入dos界面,在ASPEN PLUS SIMULATION ENGINE所在的目录下,引用aspcomp命令: ASPCOMP *.F 编译结束后,在Fortran子程序的同级目录下,会生成同名的用户模型目标模块文件,以OBJ 为扩展名。 将这些OBJ文件放到运行目录中,就可以在ASPEN模型中引用这些目标模块所建立的用户模型了。 具体步骤为: 开始--程序---aspen tech----aspen engineering suite ---aspen plus 11.1(2006)--aspen simulation engine-----进入DOS画面,输入aspcomp命令编译用户模型----编译成功,生成.obj的目标文件和.dll共享文件-----把OBJ文件放到运行目录中,就可以在ASPEN模型中引用这些目标模块所建立的用户模型了,OK了!

相关文档
最新文档