Fortran将文件读入数组 - 转置维度

时间:2013-04-08 14:32:35

标签: file-io io fortran

我正在尝试将文件读入Fortran程序的内存中。该文件具有N行,每行包含两个值。这就是我目前所做的(它编译和运行,但给出了错误的输出):

program readfromfile
  implicit none

    integer :: N, i, lines_in_file
    real*8, allocatable :: cs(:,:)

    N = lines_in_file('datafile.txt') ! a function I wrote, which works correctly

    allocate(cs(N,2))

    open(15, 'datafile.txt', status='old')
    read(15,*) cs

    do i=1,N
        print *, cs(i,1), cs(i,2)
    enddo

end

我希望获得的是加载到变量cs中的数据,第一个索引为行,第二个索引为列,但是当上面的代码运行时,它首先打印一行包含两个“左列”值,然后是具有两个“右列”值的行,然后是具有下两个“左列值”的行,依此类推。

以下是对情况的更直观的描述:

In my data file:       Desired output:        Actual output:
A1   B1                A1   B1                A1   A2
A2   B2                A2   B2                B1   B2
A3   B3                A3   B3                A3   A4
A4   B4                A4   B4                B3   B4

我在分配cs时尝试切换索引,但结果相同(或者段错误,取决于我是否也在print语句处切换索引)。我也尝试逐行读取值,但由于数据文件的格式不规则(以逗号分隔,而不是列对齐),我根本无法使用它。

如何将数据读入内存是实现我想要的结果的最佳方式?

1 个答案:

答案 0 :(得分:9)

我的数据文件中没有显示任何逗号。无论如何,它不应该与列表导向输入有任何区别。试着像你写的一样阅读它。

do i=1,N
    read (*,*) cs(i,1), cs(i,2)
enddo

否则,如果您在一个命令中读取整个数组,它会按列主要顺序读取它,即cs(1,1), cs(2, 1), ....cs(N,1), cs(1, 2), cs(2,2), ...这是数组存储在内存中的顺序。