如何更改此代码才能使用?
real(8), dimension(11), intent(inout) :: x
integer(4) :: idx
character(len=4) :: fake_read_first
character(len=4) :: fake_read_second
integer(4) :: fake_index
do idx = 1_idp, n, 1_idp
read(nfile, FMT="(a,i5,a,f28.18)") fake_read_first, fake_index, &
fake_read_second, x(idx) ! read line wise
end do
它读取具有以下形式的文件的数据(原样是空格)
eps( 1) = -1.534875443410773865
eps( 2) = 1.879729927704710146
eps( 3) = -1.141802880301361789
eps( 4) = -0.762516225079661325
eps( 5) = -0.698569538839495241
eps( 6) = 1.000000000000000000
eps( 7) = 1.918166206055258449
eps( 8) = 0.321720085182322979
eps( 9) = -1.325650752925679132
eps( 10) = -1.596179600738307780
eps( 11) = 1.786605261597484340
我收到以下错误:
At line 90 of file ddnls_mlce_thps_main.f90 (unit = 10, file =
'__init_ddnls_mlce_thps__.ini')
Fortran runtime error: Bad value during integer read
答案 0 :(得分:3)
首先要做的事:您的代码似乎有效。检查您的数据文件是否符合您在每行上给我们的格式。
其次:有很多方法可以读取这些数据。你可以做你做的事情,并使用每次阅读后丢弃的虚拟变量。
我会做什么,因为我认为它使代码中易于理解(我认为非常有价值)是将每一行读入一个字符串,在该字符串中找到=
,然后读取该字符串中的值。这是一个例子:
program read_data
use iso_fortran_env, only: int32, real64
implicit none
real(kind=real64) :: x(11)
character(len=100) :: line
integer(kind=int32) :: idx, start_pos
integer :: u
open(newunit=u, file='data.txt', action='read', status='old')
do idx = 1, size(x), 1
read(u, '(A)') line
start_pos = index(line, '=') + 1
read(line(start_pos:), *) x(idx)
end do
close(u)
print '(F24.18)', x
end program read_data
您可能需要引入一些错误检查:检查iostat
和iomsg
语句中的open
和read
值。通过检查=
是否大于1来检查行中是否确实存在start_pos
符号(如果未找到子字符串,则index
返回0)。