我正在尝试从使用Fortran创建的txt文件中读取多个变量。文件的行数以及每行写入的数字都是随机的。
文件看起来像这样:
1061 2.5 5.0 7.5 3.5
1062 9.0 2.5 10.0 7.5
然后,我在单独的Fortran程序上打开文件,然后尝试从中读取文件。
我的代码看起来像这样,a
是integer
,而b
,c
,d
,e
和{{ 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}},b
和c
甚至在读取命令后仍未定义。
答案 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帮助, 如果您需要更多信息。
希望有帮助。