Fortran 是否可以将递归读取限制在一行中?

Fortran 是否可以将递归读取限制在一行中?,fortran,Fortran,我上一篇文章的进一步问题: 在我的上一篇文章中,我想弄清楚当输入文件中没有足够的元素时,如何识别读取错误,这可以通过在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

我上一篇文章的进一步问题:

在我的上一篇文章中,我想弄清楚当输入文件中没有足够的元素时,如何识别读取错误,这可以通过在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
1,3
2
我的新问题是,当第一行中的元素少于三个时,程序将自动读取下一行中开关_1的元素,开关_2将无需读取,并且当程序编码时,它将返回“开关2错误”。 例如,当输入如下所示时:

1,2,3
1
1,3
2

然而,真正错误的是开关1。由于没有足够的元素用于开关_1,它将转到下一行,填充数组的最后一个位置。这不是我想要的。我想要的是将读取限制在一行,这样程序就不会自动读取另一行,在这种情况下,程序可以在开关_1处停止,并给我“开关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
包含的全部内容。

我发现,如果在每行末尾添加注释,因为字符a是不同的数据类型,它将不会被读取为整数。优点是当每个开关没有足够的元素时,程序将首先读取注释,而不是读取下一行,并给出正确的错误消息

例如,将输入设置为:

1,2,3         ! Switch 1
4             ! Switch 2

使用此结构,即使开关1没有足够的输入元素,它也不会将4作为第三个元素读取,而是读取注释“!switch 1”,它肯定会为开关1返回错误。这正是我想要的,这与数字读取程序配合得很好。但是,如果开关_1的数据类型在开头是字符,会发生什么情况?它不会停留在数字上。

这与数字有什么区别?你应该参考上一个问题并解释其中的差异,否则你会面临关闭和否决的风险。还要解释你看到的错误。它打印什么吗?结果是否有误?谢谢,我会在问题中添加更多细节。非常感谢您的回复!这是有帮助的,但我认为当程序变大时有点太复杂了。再次感谢您,那么您希望从修复中获得哪些其他目标呢?我建议的解决方案只为每个常见的读取调用增加一行。我发现如果程序只处理数字,在输入文件中添加注释可以很好地解决我的问题。但我不确定在处理字符串输入时会发生什么。在这种情况下,我可能不得不使用你的方法。我只想让代码尽可能简单