是否可以限制一行中的递归读数?

时间:2015-07-18 21:40:56

标签: fortran

我上一篇文章的进一步提问: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停止并给我“错误”。有可能吗?

2 个答案:

答案 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的数据类型在开头是字符,会发生什么?它不会停留在数字上。