在fortran 90中打开并读取一行数据

Sit*_*... 4 fortran fortran90

我做了一些虚拟代码来学习打开和读取文件.假设我有以下test.dat读取

1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

我编写了以下代码来打开并读取数据文件

subroutine readdata
implicit none

integer             :: j
double precision    :: test

open(unit = 100, file = 'test.dat', status = 'old', action = 'read')
 do j = 1,  10
 read(100,*) test
 print *, 'N1=', test
end do

end subroutine
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,输出如下所示

 gfortran -g  -I/usr/include -o main main.o subroutines.o -L/usr/lib64/liblapack -L/usr/lib64/libblas
 test=   1.0000000000000000     
 test=   2.0000000000000000     
 test=   3.0000000000000000     
 test=   4.0000000000000000     
 test=   5.0000000000000000     
 test=   6.0000000000000000     
 test=   7.0000000000000000     
 test=   8.0000000000000000     
 test=   9.0000000000000000     
 test=   10.000000000000000     
 Main finished.
Run Code Online (Sandbox Code Playgroud)

但是,如果数据存储在单行中,如下所示

1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)

那么上面的代码不能按预期工作.它只读取行中的第一个元素,然后提示错误

sharwani@linux-h6qd:~/PHD_research/myCodes/data> ./runcase.sh
rm -f *.o *.mod *.MOD *.exe *.stackdump main
gfortran -g  -I/usr/include -c main.f90
gfortran -g  -I/usr/include -c subroutines.f90
gfortran -g  -I/usr/include -o main main.o subroutines.o -L/usr/lib64/liblapack -L/usr/lib64/libblas
test=   1.0000000000000000    
At line 9 of file subroutines.f90 (unit = 100, file = 'test.dat')
Fortran runtime error: End of file
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是我有一个数据文件,其中包含存储在一行中的2879(1 x 2879)个数字.我如何打开并读取数据文件中的所有数字?

Hig*_*ark 11

read默认情况下,每个Fortran 语句都会读取值列表,然后前进到下一行的开头.可以想象read将光标移动到输入文件中.所以你的陈述

read(100,*) test
Run Code Online (Sandbox Code Playgroud)

当输入文件中的数字位于不同的行上时,您的期望是什么.当它们都在文件的同一行时,第一个读取语句读取一个值(即test),然后前进到下一行的开头读取下一个值,但是没有下一行,你得到运行时错误你向我们展示了

有两个简单的解决方案.

一,您可以在一个语句中从一行读取多个值,例如,您可以声明

real, dimension(10) :: test
Run Code Online (Sandbox Code Playgroud)

然后

read(100,*) test
Run Code Online (Sandbox Code Playgroud)

应该一次性将所有值都放入数组中.

其次,您可以使用non-advancing输入,它告诉处理器在每个read语句之后不跳到下一行的开头.类似下面的内容(根据您的具体情况查看编辑描述符)

read(100,'(f8.2)',advance='no') test
Run Code Online (Sandbox Code Playgroud)

如果您选择后一种方法,请不要忘记,在您读取了一行中的所有值后,您希望跳到下一行的开头,这样您可能需要执行一个语句,例如

read(100,*)
Run Code Online (Sandbox Code Playgroud)

它不会读取任何值但会前进到下一行.