如何在Fortran中预填充READ语句变量?

时间:2017-12-09 07:14:05

标签: fortran

我有一个程序,它有一个菜单,有多个选项(搜索记录,添加记录,删除记录,修改记录)。我想要做的是一种自动填充功能。

Ex:在搜索选项中输入记录号,但在搜索数据库后,找不到该记录。然后,系统会提示您选择搜索其他记录编号或使用刚输入的变量添加新记录。如果您选择添加,我希望程序调用add子例程,并且已经将读取的语句自动填充到您在搜索子例程中读入的记录。

这是我的代码看起来的样子(搜索子程序使用搜索功能查找master.db中的记录号,显示子程序在屏幕上以格式化数组打印出结果;搜索和显示都使用主模块,在定义的记录中包含字符和整数变量):

SUBROUTINE search
IMPLICIT NONE
CHARACTER::readRecord*10, changeOpt*1
INTEGER::recNum, search

OPEN(20, FILE="master.db", FORM="FORMATTED", ACCESS="DIRECT", RECL=100)
DO
  CALL SYSTEM ("clear")
  WRITE(*,"(2/,20X,A25)")"* * * Search Record * * *"
  WRITE(*,100,ADVANCE="NO")"Please enter a record number or Q to exit:"
100 FORMAT(1/,20X,A42,1X)
  READ(*,200)readRecord
200 FORMAT(A10)

  IF(readSSN=="Q" .OR. readSSN=="q")RETURN
  recNum=search(readRecord)

  IF (recNum==0)THEN
    CALL SYSTEM("clear")
    WRITE(*,"(2/,20X,A26)")"* * * Display Record * * *"
    WRITE(*,300,ADVANCE="NO")"Record ", readRecord," not found. ","Would you like to add a new record (Y/N)?"
300 FORMAT(1/,20X,A7,A10,A12,1/,20X,A41,1X)
    READ*,changeOpt
  IF(changeOpt=="Y" .OR. changeOpt=="y") CALL add
    CYCLE
  ELSE
    CALL display
    WRITE(*,400,ADVANCE="NO")"Press ENTER to continue:"
400 FORMAT(1/,20X,A24,1X)
    READ*,
  END IF
END DO
CLOSE(20)
END SUBROUTINE search

在add子例程中,一切都达到

recNum=search(readRecord)

与搜索子程序相同。我想要的是一种将输入的信息带到

的方法
READ(*,200)readRecord

在搜索子程序中,以某种方式暂时保存它,然后一旦调用add子程序,自动将其输入

READ(*,200)readRecord
在add子例程中

,这样用户就不必重新输入他们想要添加的记录号。

我认为这可能会完成,但我不知道语法是:

! WRITE readRecord to some specific place in master.mod
! CALL add

! Once in add:
! At READ(*,200)readRecord, search police.mod to check if it
! has a readRecord already written in it.
! If it does, autofill READ(*,200)readRecord with the readRecord
! from police.mod.
! Then delete readRecord from police.mod (so that if you go directly
! into the add subroutine later, it doesn't autofill a record from a
! previous search).
! If there is no readRecord in police.mod then just prompt for user
! to enter readRecord like in the search subroutine.

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

你没有说清楚,但我认为通过"自动填充READ变量" 你希望字符串预先填写在屏幕上的提示符和用户可以编辑它或只需按Enter键。

使用read语句在Fortran中无法实现这一点。声明没有这种方式,没有这样的选择。

您可以使用某些库实现类似的功能。它们通常用C语言编写。虽然它们不能使用read语句,但它们通常用C语言编写。例如 readline ncurses 库。见相关 pre-fill stdin in C

您可以在标准Fortran中执行的操作是使用if条件并检查用户是否决定输入空字符串并使用某个默认的先前值(如果发生这种情况)。