Fortran写文件这事,看着简单,踩坑的人一堆。2026年了,还有人把status参数填错导致程序直接崩溃,或者access权限搞反了数据全覆写。write方法是Fortran文件I/O里用得最多的命令,但参数组合有十几种,选错一个就出问题。今天把open、write、close这套流程和5个关键参数全部拆开,代码直接抄就能跑。
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种常用取值,搞混了后果很严重。
| 取值 | 含义 | 出错场景 |
|---|---|---|
| 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='READ',只读模式。文件只能读不能改,写操作会报错。适合读取之前算好的结果文件。
ACCESS='WRITE',只写模式。文件只能写不能读。这个参数用得少,但在某些并行计算里需要,防止多个进程同时读一个文件导致竞争。
ACCESS='APPEND',追加模式。在文件末尾续写内容,不覆盖已有数据。这是最常用的参数,跑长时程仿真的时候每隔一段时间往同一个文件里追加一行结果,用的就是这个。
我跑一个地震波传播模拟,总时长120秒,每0.01秒输出一个时间步的数据。如果用write模式,每次都覆盖,最后只剩最后一个时间步。换成append模式,12000个时间步的数据全在一个文件里,后处理直接读就行。
选错access会怎样?我试过一次,把append写成了write,结果文件从2.3GB变成了12KB,因为每次都覆盖,最后只剩最后一行数据。找了半天才发现是这个参数的问题。
矩阵输出是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 等。