Fortran无法从文件读取

时间:2019-12-14 14:05:46

标签: fortran

我正在尝试从使用Fortran创建的txt文件中读取多个变量。文件的行数以及每行写入的数字都是随机的。

文件看起来像这样:

1061    2.5   5.0    7.5    3.5
1062    9.0   2.5   10.0    7.5 

然后,我在单独的Fortran程序上打开文件,然后尝试从中读取文件。

我的代码看起来像这样,ainteger,而bcde和{{ 1}}都是真实值:

f

当我尝试运行程序时,出现运行时错误,告诉我我在引用未定义的变量,而当我尝试运行调试器时,变量 open(10,file='data.txt',form='unformatted') do read(10,*,iostat=st) a,b,c,d,e if(st==-1) exit f=a+b+c+d+e end do a,{{ 1}},bc甚至在读取命令后仍未定义。

2 个答案:

答案 0 :(得分:4)

在我看来,您的文件是格式化文件(实际上,您使用*作为格式)。但是,您在'unformatted'语句中将其定义为open。尝试设置

form='formatted'

在您的open语句中,或者只需省略form=子句,因为默认格式已格式化。

答案 1 :(得分:1)

仅汇总评论和现有答案,您应该删除 打开语句中的'unformatted'关键字,因为fortran读取文本文件 作为您的data.txt的默认格式。

假设您的文本文件可能如下所示:

1061    2.5   5.0    7.5    3.5
1062    9.0   2.5   10.0    7.5
1063    4.0   3.1    3.2    5  
1064    2.1   1.9  *****    7.8
1065    1.0   4.0   10.0    3.5
1066    4.4   1.9    2.5
1067    6.7   8.8   10.9   12.0

然后,您应该在此之后处理不同的格式错误 最小的例子:

program FileIO
implicit none
character(256) :: line
character(80)  :: msg
integer :: a,st
real :: b,c,d,e,f

open(10,file='data.txt')
do
    write(*,'(A)') '------------------------------------------------------------'
    read(10,'(A)',iostat=st) line                 ! Buffer input in line
    write(*,'(A)') 'Reading of line '//trim(line)
    if (st < 0) then                              ! End of file or end of record
        exit
    else
        read(line,*,iostat=st,iomsg=msg) a,b,c,d,e
        write(*,'(A)') 'IO-message is: '//trim(msg)
        if (st == 0) then                         ! Read one line successfully
            write(*,'(A)') 'Line successfully read: '//trim(line)
            f=a+b+c+d+e                           ! Calculate result
        else
            write(*,'(A)') 'IO-error occured in line: '//trim(line)
            f=0
        endif
    endif
end do
close(10)

end program FileIO

iostat的否定结果表示文件结束或记录事件结束。 iostat的肯定结果表示运行时错误消息,请参见例如为Intel Fortran

这应该通过if条件来处理。

我建议您将文件输入缓冲在字符变量中,例如line。 它可以帮助您将错误生成行写回到日志文件或标准文件中 输出。

最小示例生成此输出:

------------------------------------------------------------
Reading of line 1061    2.5   5.0    7.5    3.5
IO-message is:                                                                  
Line successfully read: 1061    2.5   5.0    7.5    3.5
------------------------------------------------------------
Reading of line 1062    9.0   2.5   10.0    7.5
IO-message is:                                                                  
Line successfully read: 1062    9.0   2.5   10.0    7.5
------------------------------------------------------------
Reading of line 1063    4.0   3.1    3.2    5
IO-message is:                                                                  
Line successfully read: 1063    4.0   3.1    3.2    5
------------------------------------------------------------
Reading of line 1064    2.1   1.9  *****    7.8
IO-message is: list-directed I/O syntax error, unit -5, file Internal List-Directed Read
IO-error occured in line: 1064    2.1   1.9  *****    7.8
------------------------------------------------------------
Reading of line 1065    1.0   4.0   10.0    3.5
IO-message is: list-directed I/O syntax error, unit -5, file Internal List-Directed Read
Line successfully read: 1065    1.0   4.0   10.0    3.5
------------------------------------------------------------
Reading of line 1066    4.4   1.9    2.5
IO-message is: end-of-file during read, unit -5, file Internal List-Directed Read
IO-error occured in line: 1066    4.4   1.9    2.5
------------------------------------------------------------
Reading of line 1067    6.7   8.8   10.9   12.0
IO-message is: end-of-file during read, unit -5, file Internal List-Directed Read
Line successfully read: 1067    6.7   8.8   10.9   12.0
------------------------------------------------------------
Reading of line 1067    6.7   8.8   10.9   12.0

即使数字5为 以整数形式提供给实变量e。第*****行的格式错误 正确检测到1064以及1066行中缺少的数字。

请查看有关list-directed reading的Intel Fortran帮助, 如果您需要更多信息。

希望有帮助。