ストリーム I/O

ストリーム I/O は、外部ファイル内のデータを ASCII、EBCDIC、または GRAPHIC 文字のストリームとして扱います。ストリーム I/O 操作では、プログラム変数のリストは、データの実際の入力または出力フィールドに関連付けられます。

ストリーム I/O 文には次の 2 つの形式が存在します。

List-directed ストリーム I/O と Edit-directed ストリーム I/O の両方で、ファイルは、PUT 文によって書き込まれ、GET 文によって読み取られます。Edit-directed ストリーム I/O では、データは、フォーマット リストの制御下でストリーム ファイルとの間で伝送されます。List-directed ストリーム I/O では、データは、フォーマット リストなしでストリーム ファイルとの間で伝送されます。Edit-directed ストリーム I/O では、フォーマット リストは、GET 文または PUT 文に含めることも、FORMAT 文で指定することもできます。

GET 文または PUT 文を実行した場合は、ストリーム ファイルの現在の行との間でデータが伝送され、ストリーム ファイルの行全体が使用または生成されるとは限りません。複数の PUT 文を使用して特定の行を構築することも、1 つの PUT 文を使用して複数の行を出力することもできます。同様に、複数の GET 文で特定の行から値を読み取ることも、1 つの GET 文を使用して 1 つ以上の行を読み取ることもできます。ディスク ファイルから読み取られた行が Open PL/I によって変更されることはありません。ただし、他のすべてのデバイスから読み取られた行では、末尾の空白が削除され、GET 文が読み取る各行の末尾に空白が 1 つ追加されます。この空白は、行の先頭に入力されたフィールドが前の行の末尾に入力されたフィールドに追加されないようにます。

各ストリーム ファイルには、ファイルが開かれたときに決定される関連付けられた行サイズがあります。出力ファイルの行には n 個の文字が含まれます。この n は、ファイルの行サイズです(詳細については、「Stream File Attributes」セクションの LINESIZE オプションに関する説明を参照してください)。List-directed ストリーム I/O 文の次の例に示すように、PUT 文で SKIP オプションを使用すると、より短い行を作成できます。短い行は、n 文字の長さになるように、右側が空白で埋められます。次に例を示します。

PUT FILE(F) SKIP LIST(A,B,C); 
PUT FILE(F) SKIP;

この例では、現在の行 (前に出力されたデータで構成) が出力され、A、B、C の値を含む 1 つ以上の新しい行が作成されます。2 番目の PUT 文は、A、B、C を含む最後の行を強制的に出力し、新しい行を開始します。SKIP オプションは、新しいデータが伝送される前に常に実行されます。

入力時、各行は、行サイズの値までの任意の長さになります。GET 文は、実行されると、新しい行に到達するまで現在の行から読み取り、新しい行は無視され、変数のリストを読み取るまで値および行の読み取りを継続します。次の例に示すように、SKIP オプションを使用すると、値を読み取る前に新しい行を強制的に読み取ることができます。

GET FILE(F) LIST(A,B,C); 
GET FILE(F) LIST(D);
GET FILE(F) SKIP LIST(X,Y);

前の例では、A、B、C は、現在の行または必要な数の行から読み取られます。D は、C がその行の最後の値でない限り、C と同じ行から読み取られます。SKIP オプションは、新しい行にスキップし、結果として、D が受け取った値の後に行に残っている値をすべて無視します。X および Y は、SKIP オプションの後にある現在の行から、および必要に応じて追加の行から読み取られます。

次の例に示すように、PUT 文で PAGE オプションを使用すると、値を伝送する前に新しいページを開始できます。

PUT FILE(F) PAGE LIST(A,B,C);

GET、PUT、および FORMAT 文の詳細については、「Statements」の章を参照してください。

注:

標準 PL/I には、ストリーム ファイル内において、現在の位置から改行インジケーターまでの可変長の入力行を読み取る方法がありません。Open PL/I には、現在の位置から新しい行までのすべての文字を文字可変変数に読み取る非標準の方法として、READ 文および Edit-directed GET 文という 2 つの方法が用意されています。GET 文で可変長の行を読み取るには、フィールド幅のない A 形式を使用する必要があります。