我上一篇文章的进一步提问:What is this error in fortran and how to stop the program when it occurs?
在我的上一篇文章中,我想弄清楚当输入文件中没有足够的元素可以通过在read语句中使用iostat来解决时如何识别读取错误。
我的新代码是:
program main
implicit none
integer ioerr, switch_1(3), switch_2, i, readerr
open(100, FILE='./input_error.gr', ACTION='READ', IOSTAT=ioerr)
if (ioerr == 0) then
read(100, *, iostat=readerr) (switch_1(i), i=1,3)
if(readerr .ne. 0) then
write(*,*) 'switch 1 wrong'
stop
end if
write(*,*) 'Switch_1 is: ', switch_1
read(100,*,iostat=readerr) switch_2
if(readerr .ne. 0) then
write(*,*) 'switch 2 wrong'
stop
end if
write(*,*) 'Switch_2 is: ', switch_2
else
write(*,*) 'File not read'
end if
end program main
我的输入文件如下所示:
1,2,3
1
我的新问题是,当第一行中的元素少于三个时,程序将自动读取Switch_1的下一行中的元素,而Switch_2将无法读取任何内容,并且由于程序已编码,它将返回&# 34; Switch 2错误"。 例如,当输入如下:
1,3
2
然而,真正错误的是switch_1。由于switch_1没有足够的元素,因此它会转到下一行填充数组的最后一个位置。这不是我想要的。我想要的是将读数限制在一行,这样程序就不会自动读取另一行,在这种情况下,程序可以在switch_1停止并给我“错误”。有可能吗?
答案 0 :(得分:1)
我通常首先通过将行读入字符串,然后尝试从字符串中读取数字来解决此问题。例如,
character(len=200) :: str ! Long enough to hold a whole line
integer :: i(3), ier, fid
fid = 100
open(fid, FILE='./input_error.gr', ACTION='READ')
! -- Read a *single* line, and put it all into str
read(fid,'(a)') str
! -- Read str into integer array i
read(str,*,iostat=ier) i(1:3)
! -- Check if the line actually contained 3 integers
if (ier /= 0) then
write(*,*) 'Unsuccessful read'
endif
因此,read语句只能使用当前行,因为它只包含str
。
答案 1 :(得分:0)
我发现如果我在每一行的末尾添加注释,因为字符a是不同的数据类型,它不会被读作整数。优点是当每个开关没有足够的元素时,程序将首先读取注释而不是读取下一行并给出正确的错误消息。
例如,输入如下:
1,2,3 ! Switch 1
4 ! Switch 2
使用这种结构,即使没有足够的输入元素用于开关1,它也不会读取4作为第三个元素,而是读取注释“!Switch 1”,这肯定会为Switch返回错误这正是我想要的,这对于数字阅读程序来说很好。但是,如果switch_1的数据类型在开头是字符,会发生什么?它不会停留在数字上。