Fortran 是否可以将递归读取限制在一行中?
我上一篇文章的进一步问题: 在我的上一篇文章中,我想弄清楚当输入文件中没有足够的元素时,如何识别读取错误,这可以通过在read语句中使用iostat来解决 我的新代码是: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
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的数据类型在开头是字符,会发生什么情况?它不会停留在数字上。这与数字有什么区别?你应该参考上一个问题并解释其中的差异,否则你会面临关闭和否决的风险。还要解释你看到的错误。它打印什么吗?结果是否有误?谢谢,我会在问题中添加更多细节。非常感谢您的回复!这是有帮助的,但我认为当程序变大时有点太复杂了。再次感谢您,那么您希望从修复中获得哪些其他目标呢?我建议的解决方案只为每个常见的读取调用增加一行。我发现如果程序只处理数字,在输入文件中添加注释可以很好地解决我的问题。但我不确定在处理字符串输入时会发生什么。在这种情况下,我可能不得不使用你的方法。我只想让代码尽可能简单