Fortran文件操作之 open

文章讨论了Fortran编程中open函数在ifort和gfortran编译器下的不同,特别是在处理二进制文件时涉及的记录长度(RECL)单位差异。在ifort中,RECL的单位是4字节,而在gfortran中是1字节。因此,转换计算以确保兼容性是必要的。另外,解决gfortran编译时的截断重寻址至相符错误,可以添加编译选项-mcmodel=medium。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.

如此,便能正确读取二进制文件了。

——————-————————

注:本节内容参考

  1. https://qa.1r1g.com/sf/ask/1834131351/
  2. https://qa.1r1g.com/sf/ask/2288070431/

截断重寻址至相符

出现如下报错:

截断重寻址至相符: R_X86_64_PC32 针对 .bss

加入编译选项 -mcmodel=medium

gfortran -o XXXX xxxxx.f -mcmodel=medium
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值