使用FORTRAN读取包含,char,integer和real的数据的语句

时间:2018-04-18 19:29:34

标签: fortran

如何更改此代码才能使用?

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

1 个答案:

答案 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

您可能需要引入一些错误检查:检查iostatiomsg语句中的openread值。通过检查=是否大于1来检查行中是否确实存在start_pos符号(如果未找到子字符串,则index返回0)。