我做了一些虚拟代码来学习打开和读取文件.假设我有以下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)
它不会读取任何值但会前进到下一行.
| 归档时间: |
|
| 查看次数: |
27612 次 |
| 最近记录: |