防止FORTRAN在输入字符而不是数字时关闭

时间:2012-08-27 16:23:15

标签: fortran gfortran

我有一个read语句,需要一个非常简单的示例代码:

program test
integer var
read(*,*) var
end

事情是我通常会因为分心而输入一串字符(即:)。如何防止我的代码完全停止,而是显示类型的错误消息您输入的值不正确。再试一次

我在想:

    program test
    integer var
10  read(*,*) var
    if (var.not.a.number) then
      write(*,*)'You've entered an incorrect value. Try again'
      goto 10
    endif
    end

var.not.a.number 条件会是什么样的? 我使用gfortran在Ubuntu下编译。


编辑:谢谢大家!我最终实现了HPM的第三个选项,因为它是最简单的选项:

    program test
    integer var,iostat,ios
10  read(*,*,iostat=ios) var
    if (ios.ne.0) then
      write(*,*)'You've entered an incorrect value. Try again'
      goto 10
    endif
    end

特别感谢User7391努力编写所有代码!

3 个答案:

答案 0 :(得分:5)

您正在使用列表导向的输入。语句*中的第二个read(*,*)实质上告诉编译器/运行时系统,您将在运行时为其提供一些可以解释为integer的内容。如果你想给自己输入错误的自由,你有(至少)3个选择。

  1. 您可以,正如@ User7391的回答所说,将输入读入字符变量并自行解析。那个用户甚至愿意为你编写代码!
  2. 您可以将读取命令修改为类似read(*,*,err=1234)的内容,其中1234是错误处理语句的标签。这种方法现在被认为是相当老套的,可能会不受欢迎。
  3. 您可以将读取命令修改为read(*,*,iostat=ios),其中ios是一个整数变量,用于捕获iostat报告的read(i / o状态标志)声明。然后,您可以编写行if (iostat/=0) ...以进行错误处理。这被认为是最新的方法。

答案 1 :(得分:4)

也许您可以将值读入字符变量,然后相应地处理该字符变量。

如果它只包含数字,则将其存储在var中,否则报告错误并循环回来。

要检查某个字符是否只是数字,请考虑以下示例代码:

PROGRAM test
CHARACTER(len=100) :: input
LOGICAL :: is_numeric, success
INTEGER :: var

DO 
READ(*,*) :: input
IF (is_numeric(input)) THEN
  READ(input,*) var
  success = .TRUE.
ELSE
  WRITE(*,*) 'ERROR: Input is not numeric.'
END IF

IF (success) THEN
  break
END IF

END DO

END PROGRAM test


LOGICAL FUNCTION is_numeric(string)
  IMPLICIT NONE
  CHARACTER(len=*), INTENT(IN) :: string
  LOGICAL :: is_numeric
  INTEGER :: var
  INTEGER :: error_val
  READ(string,*,IOSTAT=error_val) x ! This line converts string to an integer
                            ! If there was an error, the error_val variable is
                            ! non-zero

  is_numeric = error_val==0

END FUNCTION is_numeric

如果您需要帮助编写示例代码,请告诉我。

您需要能够将字符转换为整数。内部读/写语句可以实现这一点。

答案 2 :(得分:3)

使用旧的FORTRAN:

90 continue
read (*, *, err=90) number

这可以更详细,您可以测试错误并输出错误消息。