open函数
在Fortran中,我们一般使用open函数打开一个文件,其基本语法规则如下:
OPEN(UNIT=number,FILE=filename, FORM=’…’, STATUS=’…’, ACCESS=’…’, RECL=length, ERR=label, IOSTAT=iostat, BLANK=’…’, POSITION=’…’, ACTION=action, PAD=’…’, DELM=’…’)
比较常用的有:
UNIT=number 用一个整数表示打开文件,但是最好避开1,2,5,6,因为2、6表示屏幕,而1、5表示键盘。
FILE=filename 打开文件,若和.f90文件不在一个目录下要记得打全文件路径。
FORM=’…’ FORM='FORMARTTED’表示文件将以文本文件保存, FORM=‘UNFORMATTED’则表示文件将以二进制文件保存。
STATUS=’…’ ‘NEW’表示这个文件原本不存在,是第一次打开。‘OLD’表示这个文件原本就存在。‘REPLACE’表示这个文件不论原先是否存在都会创建新文件(覆盖)。‘SCRACH’表示暂存,在程序跑完之后,会将临时程序删除。
RECL=length 表示每一个模块单元的分区的长度。
ERR=label label为如果发生错误继续执行的行号,不常用。
IOSTAT=iostat >0表示读取发生错误,=0表示正常,<0表示文件终了。
***BLANK=’…’***表示用空格(‘NULL’)或者0(‘ZERO’)填补空格。
POSITION=’…’, ACTION=action, PAD=’…’, DELM=’…'都是fortran90新增的功能。分别表示读取位置、读取权限、不足字段填充、字符串输出是否要加引号。
————————————————
注:本节内容引用自CSDN博主「蓝蓝namseak」的原创文章,遵循CC 4.0 BY-SA版权协议,原文链接:
https://blog.csdn.net/One_Blue4ever/article/details/123646186
open函数在ifort和gfortran中的不同
笔者有程序使用ifort编译正常,当换了一台没装Intel编译套件的机器,只能用gfortran,在编译中就出现了如下错误:
open(30,file=filename0,Access ='Direct',Form ='Unformatted',RecL=17)
1
Error: Syntax error in OPEN statement at (1)
经查,加入action=‘read’ 可编译通过
open(30,file=filename0,Access ='Direct',Form ='Unformatted',action='read',RecL=17)
程序执行仍不能正确读取二进制文件,这是由于ifort和gfortran不会使用相同的块大小作为记录长度.
当用ifort时, open中recl的单位长度是4字节块,我的recl=17实际上代表一条记录的长度是17*4=68字节.
而gfortran中recl的单位长度是1字节大小,所以recl=17*4.
如此,便能正确读取二进制文件了。
——————-————————
注:本节内容参考
截断重寻址至相符
出现如下报错:
截断重寻址至相符: R_X86_64_PC32 针对 .bss
加入编译选项 -mcmodel=medium
gfortran -o XXXX xxxxx.f -mcmodel=medium