Fortran直接存取文件读写异常:读取结果无意义求助
以下是几个可能导致读取结果异常的原因及修复方案:
1. 写入时的数组索引错误
你写入代码中使用了real(ts0(n),8),这里的n并非循环对应的当前元素索引——循环是i从1到nrow、j从1到ncol,但始终用ts0(n)写入,相当于所有记录都写入了同一个元素的值(甚至如果n超出数组范围会触发未定义行为)。
修复写入代码:根据循环逻辑,应该使用当前记录对应的数组元素,比如用irec10作为索引(因为irec10从1开始逐次递增,正好对应每个元素的位置):
open(67,file=output3Dstr//'laststep_ts0',form='unformatted',access='direct',recl=8,status='unknown') irec10=1 do i=1,nrow do j=1,ncol write(67,rec=irec10) real(ts0(irec10),8) ! 用irec10作为数组索引 irec10=irec10+1 enddo enddo
如果ts0是二维数组,也可以写成ts0(i,j)来匹配循环逻辑:
write(67,rec=irec10) real(ts0(i,j),8)
2. 文件路径不一致
写入时的文件路径是output3Dstr//'laststep_ts0',读取时是trim(laststepstr)//'laststep_ts0',请确认output3Dstr和laststepstr指向的是同一个目录。如果路径不同,你读取的根本不是之前写入的文件,自然得到无意义结果。
3. 直接存取的记录长度定义
虽然你用了同一编译器,但部分编译器对recl参数的定义可能存在细节差异:有的编译器以字节为单位,有的以处理器字长为单位。如果你的ts0是双精度实数(8字节),recl=8在字节为单位的编译器下是正确的,但如果编译器默认以字长为单位(比如某些编译器1字长=4字节),recl=8会导致记录长度远大于实际数据长度,读取时错位。
可以尝试显式指定编译器的recl单位,比如在GCC中添加编译选项-frecord-marker=4(或根据编译器文档调整),或者验证记录长度是否匹配:写入后查看文件大小,正常情况下文件大小应该是nrow*ncol*8字节,如果大小不符,说明recl设置有问题。
4. 数组维度与读写数量不匹配
确认读取时的nrow和ncol与写入时的完全一致,且ts0数组的大小足够容纳nrow*ncol个元素。如果读取时的数组维度或大小和写入时不一致,会导致越界写入或读取,产生无意义数据。
内容的提问来源于stack exchange,提问作者Mochi

