Fortran中按指定格式将数组变量写入文件的问题
解决Fortran中三维数组与一维数组按指定格式逐行写入的问题
看起来你踩了Fortran数组输出顺序的典型坑——直接写整个数组会按它的列优先存储顺序一次性输出所有元素,完全不是你要的「每个n对应一行」的结构。咱们一步步来搞定这个问题:
为什么你的原写法行不通
你用的write(*,'(9Fw.d 1Fw.d)') A,B会先把三维数组A的所有元素按存储逻辑输出:先输出n=1的整个3×3矩阵(顺序是A11,1→A21,1→A31,1→A12,1→…→A33,1),接着是n=2的矩阵,直到n=100,总共900个数值;然后再输出一维数组B的100个数值。这和你想要的「每行对应一个n,包含9个A元素+1个B元素」的格式完全不匹配。
正确解决方案:循环遍历每个n
你需要用do循环逐个处理每个n,每次输出该n对应的9个A元素和1个B元素。Fortran的数组切片A(:,:,n)会自动按列优先展开成你需要的顺序(正好是A11,n→A21,n→A31,n→A12,n→…→A33,n),用这个切片就很方便:
program write_data implicit none integer, parameter :: N = 100 ! 定义n的最大值 real :: A(3,3,N), B(N) integer :: n ! 这里假设A和B已经完成赋值(比如读入或计算得到) ! 循环处理每个n,逐行写入 do n = 1, N ! 格式串里的10Fw.d对应9个A元素+1个B元素,这里用F8.3作为示例格式 write(*,'(10F8.3)') A(:,:,n), B(n) end do end program write_data
如果你想彻底避免依赖数组存储顺序的隐含规则,也可以手动列出每个元素,可读性更强:
write(*,'(10F8.3)') & A(1,1,n), A(2,1,n), A(3,1,n), & A(1,2,n), A(2,2,n), A(3,2,n), & A(1,3,n), A(2,3,n), A(3,3,n), & B(n)
两种写法都能实现你要的每行格式,选哪种全看你的习惯——切片写法更简洁,手动列元素更直观。
输出格式验证
运行这段代码后,每行都会严格按照你要求的顺序输出:A11,n、A21,n、A31,n、A12,n、A22,n、A32,n、A13,n、A23,n、A33,n、B,n
内容的提问来源于stack exchange,提问作者user2889824
相关产品推荐
相关产品推荐

