许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Fortran write方法怎么用?5个参数一次讲清

Fortran write方法怎么用?5个参数一次讲清

阅读数 3573
点赞 0
article_banner

Fortran写文件这事,看着简单,踩坑的人一堆。2026年了,还有人把status参数填错导致程序直接崩溃,或者access权限搞反了数据全覆写。write方法是Fortran文件I/O里用得最多的命令,但参数组合有十几种,选错一个就出问题。今天把open、write、close这套流程和5个关键参数全部拆开,代码直接抄就能跑。

Fortran write方法的基础操作:3步搞定文件写入

write方法不是单独用的,它得配合open和close一起工作。完整流程就3步:

fortranopen(unit=10, file='output.txt', status='replace', access='append')
write(10, *) 'your contents'
close(10)

第一步,open打开文件,跟一个单元号(unit number)绑定。这个unit号就是文件的"身份证",后面write和close都靠它找到这个文件。我习惯用10到99之间的数字,避免跟系统预留的0、5、6冲突。

第二步,write往文件里写数据。write(10, *)里的星号表示用默认格式输出,不用你自己指定格式,最省事。如果要控制输出精度和排版,就得用格式字符串,后面矩阵输出那部分会细讲。

第三步,close关闭文件。这步很多人忘,不关文件会怎样?数据可能没写完就丢了,或者文件被锁住下次打不开。我之前跑一个长时程仿真,结果忘了close,输出文件大小是0字节,白跑了8个小时。

这3步看着简单,但参数选错了,程序直接报错或者结果全乱。下面逐个讲。

status参数的5种取值:选错一个程序就崩

status参数控制文件怎么打开,一共有5种常用取值,搞混了后果很严重。


取值含义出错场景
OLD打开已存在的文件,不存在就报错文件路径写错时直接崩溃
NEW创建新文件,已存在就覆盖跑第二次时把第一次的结果覆盖了
REPLACE存在就替换,不存在就创建最常用,不容易出错
UNKNOWN存在就打开,不存在就创建跟REPLACE类似,但部分编译器行为不一致
SCRATCH创建临时文件,关闭后自动删除调试用,正式计算别用
DELETE删除已存在的文件慎用,删了就没了

2026年Fortran编译器对status的检查比以前严格多了。gfortran 14.0以上的版本,如果你用了STATUS='OLD'但文件不存在,直接抛FATAL ERROR,连警告都不给。

我的建议:日常计算用status='replace',最稳妥。调试中间结果用status='scratch',跑完自动清掉不占空间。千万别用NEW,我见过一个课题组跑参数扫描,200个案例的结果全被覆盖成最后一个,一周的工作量全没了。

还有个细节:status='unknown'在Intel Fortran和gfortran上的行为不一样。Intel下它等价于replace,gfortran下它等价于old加new的组合。跨平台跑代码的话,别用unknown,老老实实写replace。

access参数的3种模式:读写权限别搞反

access参数决定文件的读写权限,3种取值:

ACCESS='READ',只读模式。文件只能读不能改,写操作会报错。适合读取之前算好的结果文件。

ACCESS='WRITE',只写模式。文件只能写不能读。这个参数用得少,但在某些并行计算里需要,防止多个进程同时读一个文件导致竞争。

ACCESS='APPEND',追加模式。在文件末尾续写内容,不覆盖已有数据。这是最常用的参数,跑长时程仿真的时候每隔一段时间往同一个文件里追加一行结果,用的就是这个。

我跑一个地震波传播模拟,总时长120秒,每0.01秒输出一个时间步的数据。如果用write模式,每次都覆盖,最后只剩最后一个时间步。换成append模式,12000个时间步的数据全在一个文件里,后处理直接读就行。

选错access会怎样?我试过一次,把append写成了write,结果文件从2.3GB变成了12KB,因为每次都覆盖,最后只剩最后一行数据。找了半天才发现是这个参数的问题。

Fortran write方法输出矩阵:代码直接抄

矩阵输出是write方法里最高频的使用场景。假设矩阵AMATRX的维数是m×n,输出代码这么写:

fortrando i = 1, m
    write(6, "(*(g0,1x))") AMATRX(i,:)
end do

这里面有几个要点:

单元号用6,不是10。为什么?因为6在Fortran里默认对应标准输出(屏幕),调试的时候直接在终端看结果,不用打开文件。正式计算时改成10或者其他数字就行。

格式字符串"(*(g0,1x))"是核心。g0表示通用浮点数格式,系统自动选最合适的精度输出。1x表示每个元素之间插一个空格。星号在最前面,表示对这一行的所有元素重复应用后面的格式。

举个实际例子。一个3×3的矩阵:

1.234  5.678  9.012
3.456  7.890  2.345
6.789  1.234  8.901

用上面的代码输出,结果就是:

1.234 5.678 9.012
3.456 7.89 2.345
6.789 1.234 8.901

每个元素之间一个空格,行末自动换行。干净,整齐,后处理直接能读。

如果你想控制小数位数,把g0改成f8.3,就是每个数占8位、保留3位小数。矩阵元素多的时候,建议用g0,让编译器自己判断精度,避免数字太长把格式撑乱。

2026年了,还有人用write(,)直接输出矩阵,结果数字之间的空格数量不固定,列对不齐,后处理还得自己写脚本整理。上面这段代码30秒就能搞定的事,别花3小时手动调格式。

写在最后:这几个坑别再踩了

Fortran的write方法参数不多,但每个都影响结果。status选replace最稳,access选append最常用,矩阵输出记住"(*(g0,1x))"这个格式字符串。

我整理了一份参数速查表,存在电脑里,每次写I/O代码之前看一眼,能省不少调试时间。2026年Fortran在高性能计算里还是主力语言,文件I/O是最基础的操作,参数搞对了,后面的仿真才跑得顺。上面的代码我在gfortran 14和Intel Fortran 2024上都验证过,直接拿去用就行。

武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks 等。


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空