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,但结果相同(或段错误,取决于我是否也在 print 语句中切换索引)。我也尝试逐行读取值,但由于数据文件的格式不规则(逗号分隔,而不是列对齐),我根本无法让它工作。

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

4

1 回答 1

11

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

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

于 2013-04-08T15:16:17.387 回答