首页 > 解决方案 > 如何使用 Fortran 90 将一维数组的数据写入文件的下一列?

问题描述

基本上,我有许多一维数组需要写入同一个文件,但我需要将每个数组放在一个单独的列中,按照指定的顺序一个接一个。我会使用“do”循环,但某些数组的值可能比另一个数组多。是否有可以在写入语句中使用的格式,该格式将从下一列开始,而不是在上一列之后继续?

标签: arraysfilefortranformatoutput

解决方案


基本上你想要一个'write'语句来确定它正在写入的值是否超出数组的上限,然后如果超过上限则写一个空白。一个格式不能处理这样的调查。我怀疑是否有您需要的快捷命令。一种方法是将数组转换为字符数组,如果超出数字数组的范围,请将其留空。下面是这个想法的实现。

module sub

contains

subroutine tovalue(num_array,dim,value_array)

implicit none
real*8,intent(in)::num_array(:)
integer,intent(in)::dim

character,intent(inout)::value_array*(*)(:,:)

integer::i,n

n = size(value_array,2)

do i=1,n
    if (i<size(num_array)) then
        write(value_array(dim,i),"(F6.1)") num_array(i)
    else
        write(value_array(dim,i),"(6X)")
    end if
end do

end subroutine

end module

该子程序可以通过以下方式使用:

program test
use sub
implicit none
real*8::A(10),B(12),C(15)
integer::i,n

character,allocatable::values*6(:,:)

A = (/2,1,4,1,2,4,5,7,4,9/)
B = (/5,7,4,1,5,5,4,9,6,2,1,5/)
C = (/2,4,7,5,9,6,3,2,1,4,5,8,7,4,5/)

n = MAX(size(A),size(B),size(C))
allocate(values(3,n))

call tovalue(A,1,values)
call tovalue(B,2,values)
call tovalue(C,3,values)

print"(3A6)", values(:,1:n)

end program

推荐阅读