2015-07-18 56 views
1

从我的最后一个职位另一个问题:What is this error in fortran and how to stop the program when it occurs?是否有可能限制递归阅读在一行?

在我的最后一个职位,我想弄清楚如何识别读取错误时没有输入文件足够的元素,其可以通过使用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的下一行中读取元素将没有任何可读的内容,并且随着程序被编码,它将返回“Switch 2 wrong”。 例如,当输入是这样的:

1,3 
2 

然而,什么是真正错的是交换机_1。由于switch_1没有足够的元素,因此它会进入下一行填充数组的最后一个位置。这不是我想要的。我想要的是限制一行中的读数,所以程序不会自动读取另一行,在这种情况下,程序可以在switch_1处停止,并给我'开关1错误。可能吗?

+2

这是怎么区别从http://stackoverflow.com/questions/31464930/what-is-this-error-in-fortran-and-how-to-stop-the-program-when-it-occurs?你应该参考你以前的问题,并解释不同之处,否则你可能会面临关闭和投票的风险。 –

+0

也解释你看到哪个错误。它打印什么?结果是否错误? –

+0

谢谢,我会在我的问题中添加更多详细信息 – user3716774

回答

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 

读语句,因此只能使用当前行,因为这是所有str包含。

+0

非常感谢您的回复!这很有帮助,但是当程序变大时我觉得有点太复杂了。再次感谢您 – user3716774

+0

然后,您需要从修复程序中寻找哪些其他目标?我建议的解决方案为每个通常的读取调用添加一个额外的行。 – Ross

+0

我发现如果程序只处理数字,在输入文件中添加注释可以很好地解决我的问题。但是我不确定当我处理字符串输入时会发生什么。也许我会在这种情况下使用你的方法。我只想保持代码尽可能简单 – user3716774

0

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

例如,使输入等:

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

具有这种结构,即使不存在用于开关1足够的输入元件,所以不读取4作为第三元素,相反,它是读注释“!Switch 1”肯定会给Switch 1返回一个错误。这正是我想要的,并且这对数字阅读程序来说工作正常。但是,如果开始时switch_1的数据类型是字符,会发生什么情况?它不会停在数字上。