2017-12-09 8 views
0

私は複数のオプション(検索レコード、レコードの追加、レコードの削除、レコードの変更)を持つメニューを持つプログラムを持っています。私がしようとしているのは、自動入力機能のようなものです。FortranでREAD文の変数を事前に入力する方法は?

例:レコード番号は検索オプションに入力されますが、データベースを検索した後、そのレコードは見つかりません。別のレコード番号を検索するか、入力した変数で新しいレコードを追加するかどうかのオプションが表示されます。追加することを選択した場合は、プログラムがサブルーチンを呼び出すようにし、読み込んだステートメントを検索サブルーチンに読み込んだレコードで自動入力します。

これは私のコードのようです(検索サブルーチンは検索機能を使用して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 

、すべてのものまで

recNum=search(readRecord) 

には、検索サブルーチンと同じです。私が欲しいのは、それを何とか一時的に、検索サブルーチンで

READ(*,200)readRecord 

に入力した情報を取る保存する方法で、追加のサブルーチンが呼び出された後、その後、自動的に

READ(*,200)readRecord 

にそれを入力してください追加サブルーチンでは、ユーザーが追加したいレコード番号を再入力する必要がありません。私はこれが達成されるかもしれないと思うが、私は次のようになりの構文を知らない

方法:

! 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. 

任意の提案をいただければ幸いです。

+0

オートフィルを検索すると、通常はロジックに応じて自動的に記入されるため、* autofill *から* pre-fill *に変更することをお勧めします。たとえば、Tabキーを押すと、ディレクトリ内の既存のファイル名に従って入力されたファイル名の一部が自動入力されます。 –

+0

ほんの数コメント。1)あなたは本当にあなたの質問を説明するためのより簡単な例を開発するために働くべきです。 (実際にはデータベースとは関係がありますか?正確には正しいですか?)2)あなたは明らかに特定の端末環境(linux/xterm?)に自分自身をロックしています。それが何であれ、それを質問に入れるべきです。 – agentp

答えて

0

"READ変数を自動入力する"文字列がプロンプトの画面にあらかじめ入力されていて、ユーザーがそれを編集したり、Enterキーを押すことができます。

これは、readステートメントではFortranでは不可能です。ステートメントはこのように動作せず、そのようなオプションはありません。

特定のライブラリでも同様のことができます。通常はCで書かれていますが、read文を使用することはできません。通常はCで書かれています。たとえば、のreadlinencursesのライブラリです。関連項目を参照してください pre-fill stdin in C

標準のFortranで行うことができるのは、if条件を設定し、空の文字列を入力して何らかのデフォルトの前の値を使用することを決定したかどうかを確認することです。

関連する問題