3

我有一个需要一个数字的读取语句,非常简单的示例代码:

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谁努力编写所有代码!

4

3 回答 3

5

您正在使用list-directed input*语句中的第二个read(*,*)本质上告诉编译器/运行时系统,您将在运行时为其提供可以解释为integer. 如果您想给自己在输入时犯错误的自由,那么您(至少)有 3 个选择。

  1. 正如@User7391 的回答所说,您可以将输入读入字符变量并自己解析。那位好心的用户甚至主动提出为您编写代码!
  2. 您可以将读取命令修改为错误处理语句的标签在read(*,*,err=1234)哪里。1234这种方法现在被认为是相当过时的,可能会受到反对。
  3. 您可以将读取命令修改为类似于read(*,*,iostat=ios)where iosis an integer variable 它捕获语句iostat报告的(i/o 状态标志) 。read然后,您可以编写if (iostat/=0) ...用于错误处理的行。这被认为是最新的方法。
于 2012-08-27T16:32:45.403 回答
3

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

如果它只包含数字,则将其存储在 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

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

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

于 2012-08-27T16:26:38.320 回答
3

使用旧的 FORTRAN:

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

这可以更详细地进行,您可以在其中测试错误并输出错误消息。

于 2012-08-27T16:32:19.170 回答