2013-04-08 45 views
8

我试图在Fortran程序中将文件读入内存。该文件有N行,每行有两个值。这是我目前做的(它编译和运行,但给我的不正确的输出):Fortran将文件读入数组 - 换位尺寸

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切换时的指数,但具有相同的结果(或段错误,这取决于阉我还可以在打印切换指数声明)。我也尝试逐行读取值,但由于数据文件的格式不规则(逗号分隔,而不是列对齐),我根本无法完成这项工作。

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

回答

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), ...这是在其中将阵列存储在存储器中的顺序。

+0

我很惊讶为什么我以前无法得到这个工作,但现在它确实如此。谢谢!关于我的输入文件中的逗号,它们在实际文件中,但在示例中,我只是想要显示元素的顺序。 – 2013-04-08 15:21:48

+0

并解释为什么它做了什么,当它不工作时upvote。更多代表,先生! =) – 2013-04-08 15:22:23

+1

对于这篇文章的未来读者:我想将读取概括为一个只需要文件名和读取的行数和列数的子例程,最后得到以下隐式do结构:read(f, *((cs(row,col),col = 1,Ncols),row = 1,Nrows)。请注意,列必须位于内部循环中,原因是上面的答案中由@Vladimir F提及的原因。 – 2013-04-08 15:30:46