2015-02-11 61 views
2

如果存在iostat关键字,则发生I/O错误时程序不会停止。然后,如果我尝试将不正确的值读入标量变量,那么i会说这个变量保持不变吗?以下似乎工作:将不正确的值读入变量的尝试是否会改变其值?

program test 
    integer :: i, stat 

    i = 1 

    do 
     write (*, "('i = ')", advance='no') 
     read (*, *, iostat=stat) i 

     if (stat .eq. 0) then 
     write (*, "('Valid integer. i has been set to ', I0)") i 
     else 
     write (*, "('Bad integer. i is still ', I0)") i 
     end if 
    end do 
end program test 

我可以在Fortran 2003中依赖此行为吗?

回答

2

不,不成功读取后变量的值是未定义的。

的Fortran 2008,9.11.2

如果 执行包含任一种ERR = 说明符或IOSTAT =说明然后一个输入/输出语句的过程中发生错误条件:

。 ...

如果语句是READ语句或错误条件发生在 由READ语句启动的传输的等待操作,所有 输入项或名称在发起 转移的语句中st组对象变为undefined;

+0

仅仅是因为某个编译器(在我的情况gfortran)上述代码的行为,而不是因为标准(我找不到任何东西)的行为? – 2015-02-11 11:15:06

+0

是的,但即使使用相同的编译器,在另一种情况下也可能会失败。阅读F2008标准中的全部9.11节。 – 2015-02-11 11:15:43

+0

现在我也在Fortran 2003,9.10.1中找到了这个。谢谢! – 2015-02-11 11:28:54