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
切换时的指数,但具有相同的结果(或段错误,这取决于阉我还可以在打印切换指数声明)。我也尝试逐行读取值,但由于数据文件的格式不规则(逗号分隔,而不是列对齐),我根本无法完成这项工作。
如何将数据读入内存是实现我想要的结果的最佳方式?
我很惊讶为什么我以前无法得到这个工作,但现在它确实如此。谢谢!关于我的输入文件中的逗号,它们在实际文件中,但在示例中,我只是想要显示元素的顺序。 – 2013-04-08 15:21:48
并解释为什么它做了什么,当它不工作时upvote。更多代表,先生! =) – 2013-04-08 15:22:23
对于这篇文章的未来读者:我想将读取概括为一个只需要文件名和读取的行数和列数的子例程,最后得到以下隐式do结构:read(f, *((cs(row,col),col = 1,Ncols),row = 1,Nrows)。请注意,列必须位于内部循环中,原因是上面的答案中由@Vladimir F提及的原因。 – 2013-04-08 15:30:46