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

Tom*_*han 8 io file-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
Run Code Online (Sandbox Code Playgroud)

我希望得到的是加载到变量中的数据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
Run Code Online (Sandbox Code Playgroud)

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

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

Vla*_*r F 9

我在您的数据文件中看不到任何逗号.无论如何,它不应该与列表导向输入有任何区别.试着像你写的那样阅读它.

do i=1,N
    read (*,*) cs(i,1), cs(i,2)
enddo
Run Code Online (Sandbox Code Playgroud)

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

  • 稍微整洁:读(f,*)(cs(nrow,:),nrow = 1,nrows) (3认同)
  • 对于这篇文章的未来读者:我想将读取概括为一个子程序,该子程序只需要文件名和要读取的行数和列数,并最终得到以下隐式 do 构造:`read(f, *) ( (cs(row,col),col=1,Ncols),row=1,Nrows)`。请注意,由于@Vladimir F 在上面的答案中提到的原因,列必须位于内部循环中。 (2认同)