我正在尝试将文件读入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语句处切换索引)。我也尝试逐行读取值,但由于数据文件的格式不规则(以逗号分隔,而不是列对齐),我根本无法使用它。
如何将数据读入内存是实现我想要的结果的最佳方式?
答案 0 :(得分: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), ...
这是数组存储在内存中的顺序。