OpenVMS
ユーザーズ・マニュアル


前へ 次へ 目次 索引


14.7.4.2 システム・エラー・メッセージの禁止

システム・メッセージが出力されないようにするために,SET MESSAGE コマンドを使用することもできます。/NOFACILITY,/NOIDENTIFICATION,/NOSEVERITY,/NOTEXT のいずれかの修飾子を使用すれば,機能名,メッセージ識別,重大度レベル,メッセージ・テキストを出力しないように設定できます。

次の例では,2 番目の SET MESSAGE コマンドが実行されるまで,機能,識別,重大度,テキスト・メッセージの出力が一時的に禁止されます。


$ ! Purge files in a directory and suppress system messages 
$ ! 
$ SET DEFAULT 'P1' 
$ ! Suppress system messages 
$ ! 
$ SET MESSAGE/NOFACILITY - 
             /NOIDENTIFICATION - 
             /NOSEVERITY - 
             /NOTEXT 
$ PURGE 
$ SET MESSAGE/FACILITY - 
             /IDENTIFICATION - 
             /SEVERITY 
             /TEXT 
$ EXIT 

14.8 ファイルの読み込みと書き込み(ファイル入出力)

コマンド・プロシージャからファイルを読み込んだり,コマンド・プロシージャにファイルを書き込んだりするには,次のようにします。

手順 操作
1 OPEN コマンドを使用してファイルをオープンする。

OPEN コマンドは,論理名をファイルに割り当て,ファイルを読み込むのか,書き込むのか,または読み込みと書き込みを両方行うのかを指定する。これ以降の READ,WRITE,CLOSE コマンドは,この論理名を使用してファイルを参照する。

2 READ または WRITE コマンドを使用して,ファイルからレコードを読み込んだり,ファイルにレコードを書き込んだりする。

ファイルへの入出力を行う 1 つの方法に,レコードを読み込んだり,レコードを処理したり,変更済みのレコードを同じファイルまたは別のファイルに書き込んだりするループを設計する方法がある。

3 CLOSE コマンドを使用してファイルをクローズする。

CLOSE コマンドを取り込まない場合,ログアウトするまでファイルがオープンされたままになる。

注意

ユーザがログインすると,システムが SYS$INPUT,SYS$OUTPUT,SYS$COMMAND,SYS$ERROR の各ファイルを自動的にオープンするため,これらのファイルを読み書きのために明示的にオープンする必要はありません。

この後の節では,次のことについて説明します。

14.9 OPEN コマンドの使用

OPEN コマンドは,順編成ファイル,相対編成ファイル,索引順編成ファイルをオープンします。ファイルはプロセス永久ファイルとしてオープンされ,CLOSE コマンドでファイルを明示的にクローズしない限り,プロセスが存在する間はオープンされたままになります。ファイルがオープンされているときは,プロセス永久ファイルの使用に関する OpenVMS RMS の制限事項に従います。

OPEN コマンドは,ファイルをオープンすると,論理名(最初のパラメータとして指定される)をファイル(2 番目のパラメータとして指定される)に割り当て,その名前をプロセス論理名テーブルに収めます。これ以降の READ,WRITE,CLOSE コマンドはこの論理名を使用してファイルを参照します。

次の例では,OPEN コマンドは,論理名 INFILE を DISK4:[MURPHY]STATS.DAT ファイルに割り当てます。


$ OPEN/READ INFILE DISK4:[MURPHY]STATS.DAT 

注意

OPEN コマンドの中の論理名は固有の名前でなければなりません。入力したコマンドは正しいのに,OPEN コマンドが動作しない場合には,OPEN コマンドの中の論理名を変更します。論理名定義のリストを表示するには,SHOW LOGICAL コマンドを使用します。

コマンド・プロシージャが正しいファイルにアクセスできるようにするには,完全なファイル指定(たとえば,DISK4:[MURPHY]STATS.DAT)を使用するか,ファイルをオープンする前に SET DEFAULT コマンドを使用して正しいデバイスとディレクトリを指定します。

共用可能ファイルも指定できます。/SHARE 修飾子を使用すると,他の開かれているファイルをアクセス可能に設定できます。さらに,ユーザは DCL コマンド TYPE と SEARCH を使用して,共用可能ファイルにアクセスできます。

OPEN/READ コマンドはファイルを開き,論理名をファイルに割り当て,レコード・ポインタをファイルの先頭に設定します。読み込みの対象としてファイルを開く場合には,レコードを読み込むことはできますが,書き込むことはできません。レコードを読み込むたびに,ポインタは次のレコードに移動します。

このコマンド・プロシージャの OPEN/READ コマンドは,ファイル STATS.DAT を開き,論理名 INFILE をファイルに割り当てます。


$   OPEN/READ INFILE DISK4:[MURPHY]STATS.DAT 
$ READ_FILE: 
$   READ/END_OF_FILE=DONE INFILE DATA 
$   GOTO READ_FILE 
$ DONE: 
$   CLOSE INFILE 
$   EXIT 

新しいファイルに書き込む場合には,OPEN/WRITE コマンドを使用します。OPEN/WRITE コマンドは印刷ファイル形式で順編成ファイルを作成します。ファイルのレコード形式は固定長制御部付き可変長(VFC)であり,2 バイトのレコード・ヘッダが付いています。/WRITE 修飾子を /APPEND 修飾子と組み合わせて使用することはできません。

既存のファイルを指定した場合には,OPEN/WRITE コマンドは,既存のファイルより 1 つだけ大きいバージョン番号の新しいファイルを開きます。

次の例のコマンド・プロシージャは,書き込みのために使用できる新しいファイル(NAMES.DAT)を作成します。


$   OPEN/WRITE OUTFILE DISK4:[MURPHY]NAMES.DAT 
$ UPDATE: 
$   INQUIRE NEW_RECORD "Enter name" 
$   WRITE OUTFILE NEW_RECORD 
$   IF NEW_RECORD .EQS. "" THEN GOTO EXIT_CODE 
$   GOTO UPDATE 
$ EXIT_CODE: 
$   CLOSE OUTFILE 
$   EXIT 

OPEN/APPEND コマンドは,既存のファイルの最後にレコードを追加します。存在しないファイルを開こうとした場合には,エラーが発生し,ファイルは開かれません。/APPEND 修飾子を /WRITE 修飾子と組み合わせて使用することはできません。

次の例では,レコードが既存のファイル,NAMES.DAT の最後に追加されます。


$ OPEN/APPEND OUTFILE DISK4:[MURPHY]NAMES.DAT 
$ INQUIRE NEW_RECORD "Enter name" 
$ WRITE OUTFILE NEW_RECORD 
   .
   .
   .
$ CLOSE OUTFILE 

OPEN/READ/WRITE コマンドは,レコード・ポインタをファイルの先頭に設定し,最初のレコードを読み込むことができるようにします。この方法を使用してファイルを開く場合には,最後に読み込んだレコードだけを置換できます。新しいレコードをファイルの最後に書き込むことはできません。さらに,変更されたレコードは,置換されるレコードと正確に同じサイズでなければなりません。

次の例では,レコード・ポインタがファイル STATS.DAT の先頭に設定され,最初のレコードを読み込むことができるようにします。


$ OPEN/READ/WRITE FILE DISK4:[MURPHY]STATS.DAT 

14.10 ファイルへの書き込み

ファイルにデータを書き込むには,次のようにします。

手順 操作
1 書き込み用のファイルをオープンする。
2 書き込みループの先頭にラベルを付ける。

単独のレコードを書き込んだり読み込んだりする場合を除いて,ファイル入出力は常にループの中で実行される。

3 書き込もうとするデータを読み込む。

INQUIRE コマンドまたは READ コマンドを使用して,データをシンボルに読み込む。

4 データをテストする。

データが入ってるシンボルをチェックする。シンボルが空の場合(たとえば,Return を押して当該行にデータを入力しない場合)には,ファイルに書き込もうとするデータの終わりに達したら,ループの終わりに進む。それ以外の場合には,処理を続ける。

5 データをファイルへ書き込む。

WRITE コマンドを使用して,シンボルの値(1 つのレコード)をファイルに書き込む。

6 ループの先頭に戻る。

以下,ファイルに書き込むデータがなくなるまで,ループが繰り返される。

7 ループを終了して,ファイルをクローズする。

次のコマンド・プロシージャは,データを新しいファイル STATS.DAT に書き込みます。この名前のファイルが存在する場合には,新しいバージョンが作成されます。


$ ! Write a file 
$ ON ERROR THEN EXIT                         ! Exit if the command 
$ !                                          !   procedure cannot 
$ !                                          !   open the file 
$ OPEN/WRITE IN_FILE DISK4:[MURPHY]STATS.DAT ! Open the file 
$ ON CONTROL_Y THEN GOTO END_WRITE           ! Close the file if you 
$ !                                          !   quit execution with 
$ !                                          !   Ctrl/Y 
$ ON ERROR THEN GOTO END_WRITE               ! Close the file if an 
$ !                                          !   error occurs 
$WRITE:                                      ! Begin the loop 
$ INQUIRE STUFF "Input data"                 ! Prompt for input 
$ IF STUFF .EQS. "" THEN GOTO END_WRITE      ! Test for the end of 
$ !                                          !   the file 
$ WRITE IN_FILE STUFF                        ! Write to the file 
$ GOTO WRITE                                 ! Go to the beginning 
$END_WRITE:                                  ! End the loop 
$ !                                          ! 
$ CLOSE IN_FILE                              ! Close the file 

14.10.1 固有の名前を持つファイルの作成

固有の名前を持つファイルを作成するには,F$SEARCH レキシカル関数を使用して,その名前がすでにディレクトリに存在するかどうかを調べます。F$SEARCH についての詳細は,『OpenVMS DCL ディクショナリ』のレキシカル関数の説明を参照してください。

次のコマンド・プロシージャは,ファイル名を求めるプロンプトを出してから,F$SEARCH レキシカル関数を使用して,省略時のディレクトリで指定された名前を検索します。指定された名前を持つファイルがすでに存在する場合には,ERROR_1 に制御が渡され,プロシージャは,"The file already exists" のメッセージを表示してから,GET_NAME ラベルに制御を戻します。このとき,プロシージャは以下の例に見られるような他のファイル名を求めるプロンプトを出します。


$ ! FILES.COM 
$ ! 
$GET_NAME: 
$ INQUIRE FILE "File"           ! Prompt the user for a file name 
$ IF F$SEARCH(FILE).NES. ""   ! Make sure the file name is unique 
$ THEN 
$    WRITE SYS$OUTPUT "The file already exists" 
$    GOTO GET_NAME 
$ ELSE 
$    OPEN/WRITE IN_FILE 'FILE'  ! Open the file with WRITE access 
$ ENDIF 
   .
   .
   .
$ EXIT 

14.11 WRITE コマンドの使用

これ以降の節では,WRITE コマンドの使用について説明します。

14.11.1 データの指定

WRITE コマンドのデータを指定する場合は, 第 12 章 に説明する文字列式の規則に従います。次に,いくつかのデータの指定方法を示します。



$! Define symbols 
$! 
$ CREATED = "File created April 15, 2002" 
$ COUNT = 4 
$ P4 = "fourth parameter" 
$! 
$! Open the file DATA.OUT for writing 
$! 
$ OPEN/WRITE OUTFILE DISK4:[MURPHY]DATA.OUT 
$! 
$ WRITE OUTFILE CREATED                 (1)
$ WRITE OUTFILE "CREATED"               (2)
$! 
$ WRITE OUTFILE "Count is ''COUNT'."    (3)
$ WRITE OUTFILE P'COUNT'                (4)
$! 
$ WRITE OUTFILE "Mode is ''f$mode()'"   (5)
$! 
$ CLOSE OUTFILE 
 
 
$ TYPE DISK4:[MURPHY]DATA.OUT [Return]   (6)
File created April 15, 2002 
CREATED 
Count is 4. 
fourth parameter 
Mode is INTERACTIVE 
$ 
 

例を確認する際には,次のことに注意してください。

  1. 書き込むデータを文字列式として指定する。

  2. CREATED 文字列をリテラル文字列として出力ファイルに書き込む。

  3. リテラル文字列とシンボル名を組み合わせる。

  4. WRITE コマンドの中で一重引用符を使用してシンボル置換を強制する。この例では,WRITE コマンドは,値を COUNT シンボルに置換し,その結果のコマンド文字列(P4)でシンボル置換を行う。

  5. 一重引用符を使用してリテラル文字列とレキシカル関数を組み合わせる。

  6. 前の WRITE コマンドによって出力ファイル DATA.OUT に書き込まれたデータを表示する。

14.11.2 /SYMBOL 修飾子の使用

WRITE コマンドは,レコードを書き込むとき,書き込まれたレコードの後にレコード・ポインタを置きます。WRITE コマンドは,長さが最大 2,048 バイトまでのレコードを書き込めます。

次のいずれかの条件が存在するときには,/SYMBOL 修飾子を使用してレコードを書き込みます。

長いレコードの書き込みについての詳細は,『OpenVMS DCL ディクショナリ』の WRITE コマンドの説明を参照してください。

14.11.3 /UPDATE 修飾子の使用

WRITE コマンドと一緒に /UPDATE 修飾子を使用すれば,新しいレコードを挿入せずに,レコードを変更できます。/UPDATE 修飾子を使用するには,読み込みと書き込み両用でファイルをオープンしなければなりません。

14.12 READ コマンドの使用

READ コマンドは,レコードを読み込み,その内容にシンボルを割り当てます。READ コマンドを使用すると,1,024 文字以内の長さのレコードを読み込むことができます。ファイルからデータを読み込むには,次のようにします。

手順 操作
1 読み込み用のファイルをオープンする。
2 読み込みループの先頭にラベルを付ける。

単独のレコードを読み込んだり書き込んだりする場合を除いて,ファイル入出力は常にループの中で行われる。

3 ファイルからデータを読み込む。

READ コマンドと一緒に /EDN_OF_FILE修飾子を使用して,レコードを読み込み,その内容をシンボルに割り当てる。/END_OF_FILE 修飾子を使用すると,ファイル終わりへの到達時点で,/END_OF_FILE 修飾子によって指定されたラベルに制御が渡される。普通は,読み込みループの終わりを示すラベルを指定する。

4 データを処理する。

ファイルを順に読み込む場合には,現在のレコードを処理してから次のレコードを読み込む。

5 ループの始めに戻る。

ファイル終わりに到達するまで,ループが繰り返される。

6 ループを終了して,ファイルをクローズする。

次のコマンド・プロシージャは,STATS.DAT ファイルの中のそれぞれのレコードを読み込んで処理します。ファイルの終端状態が戻るまで,READ コマンドを繰り返し実行します。ファイルの終端状態が戻ると,END_READ のラベルが付いた行に分岐します。


$ OPEN/READ INFILE DISK4:[MURPHY]STATS.DAT  !Open the file 
$ ! 
$READ_DATA:                                 !Begin the loop 
$ READ/END_OF_FILE=END_READ INFILE RECORD   !Read a record; test for 
$                                           !  end of file 
$                                           ! Process the data 
   .
   .
   .
$ GOTO READ_DATA                            !Go to the beginning 
$                                           !   of the loop 
$END_READ:                                  !End of loop 
$ CLOSE INFILE                              !Close the file 
$ EXIT 

READ コマンドのシンボル名を指定すると,コマンド・インタプリタは,現在のコマンド・レベルのローカル・シンボル・テーブルにシンボル名を置きます。2 つ以上の READ コマンドに同じシンボル名を使用すると,それぞれの READ コマンドがシンボル名の値を再定義します。たとえば,上例のプロシージャでは,READ コマンドは,ループを通るたびに入力ファイル(STATS.DAT)から新しいレコードを読み込み,このレコードを使用して RECORD シンボルの値を再定義します。


前へ 次へ 目次 索引