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

9
我会尝试在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”时切换索引,但结果相同(或者是段错误,具体取决于我是否在打印语句中也切换索引)。我还尝试按行读取值,但由于数据文件的格式不规则(逗号分隔,而不是列对齐),因此我根本无法使其工作。
为了实现我想要的结果,我应该如何最佳方式将数据读入内存?
1个回答

12

我在你的数据文件中没有看到任何逗号。 不过,这应该不会影响到无格式输入方式。请尝试按照写入时的方式进行读取。

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), ...。 这是存储在内存中的数组顺序。

我很惊讶为什么之前我无法使其工作,但现在可以了。谢谢!关于我的输入文件中的逗号,它们实际上存在于文件中,但在示例中,我只是想可视化元素的排序。 - Tomas Aschan
对于解释为什么在它不工作时它做了什么的说明,我给你点赞。更多的声望给你,先生!=) - Tomas Aschan
2
对于这篇文章的未来读者:我想将读取文件通用化为一个子程序,只需要传入文件名以及要读取的行数和列数,最终得到了以下隐式 do 循环结构:read(f, *) ((cs(row,col),col=1,Ncols),row=1,Nrows)。请注意,由于 @Vladimir F 在上面的回答中提到的原因,列必须在内部循环中。 - Tomas Aschan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接