File I/O
본 장에서는 OpenFrame PL/I의 File I/O에 대해서 설명한다.
1. 개요
OpenFrame PL/I는 다음과 같은 2가지 방식의 File I/O 처리를 지원한다. 각각의 방식은 서로 다른 방법으로 데이터를 처리한다.
-
Record I/O
-
데이터를 변환없이 스토리지 상에 존재하는 그대로 I/O한다.
-
READ, WRITE, DELETE, REWRITE, LOCATE statement를 사용하며, 하나의 statement당 하나의 데이터를 처리한다.
-
-
Stream I/O
-
데이터를 character 형태로 변환하여 stream 형태로 I/O 한다.
-
GET, PUT statement를 사용하며, 하나의 statement당 하나 이상의 데이터를 처리한다.
-
File
File I/O를 사용하기 위해서는 FILE 속성을 가진 파일 변수를 선언해야 한다. 파일은 외부 데이터셋과 연결되며, 외부 데이터셋에 대한 속성을 지정할 수 있다.
파일과 관련된 속성들은 DECLARE statement나 OPEN statement에 사용할 수 있다. 다만, ENVIRONMENT 속성은 DECLARE statement에만 사용할 수 있다.
파일과 관련된 속성들은 다음과 같다.
속성 | 설명 |
---|---|
RECORD, STREAM |
File I/O의 방식을 지정한다.
|
INPUT, OUTPUT, UPDATE |
데이터셋의 open 모드를 지정한다.
Stream I/O는 UPDATE 속성을 사용할 수 없다. |
SEQUENTIAL, DIRECT |
데이터셋의 접근 모드를 지정한다.
Stream I/O는 SEQUENTIAL 속성만 사용할 수 있다. |
BUFFERED, UNBUFFERED |
레코드를 처리할 때 입출력 버퍼의 사용여부를 지정한다.
SEQUENTIAL 파일의 기본값은 BUFFERED이고, DIRECT 파일의 기본값은 UNBUFFERED이다. Stream I/O는 UNBUFFERED 속성을 사용할 수 없다. |
ENVIRONMENT |
ENVIRONMNET 속성으로 데이터셋의 여러 속성을 정의 할 수 있다. 다음의 속성을 정의할 수 있다.
|
KEYED |
RECORD 파일에만 사용할 수 있으며, indexed 데이터셋이나 relative 데이터셋에서만 사용할 수 있다. 속성을 정의할 경우 I/O statement의 KEY, KEYTO, KEYFROM 옵션을 사용할 수 있다. |
해당 파일을 프린터 출력용으로 지정한다. STREAM OUTPUT 파일에만 사용할 수 있다. 속성을 지정할 경우 OPEN statement에서 LINESIZE와 PAGESIZE를 지정할 수 있으며, PUT statement에서 PAGE, LINE 옵션을 지정할 수 있다. 또한 데이터를 출력할 때 각 데이터를 탭으로 구분하며, Character 데이터는 따옴표가 붙지 않는다. |
SYSPRINT와 SYSIN
SYSPRINT와 SYSIN은 PL/I 프로그램에서 제공하는 파일이다. 이 파일들은 PL/I 프로그램 내부에서 만들어지며, 명시적으로 선언하거나 열 필요가 없다.
SYSPRINT는 표준 출력을 위한 파일이고, SYSIN은 표준 입력을 위한 파일이다. SYSIN은 STREAM, INPUT 속성을 기본으로 가지며, SYSPRINT는 STREAM, OUTPUT, PRINT 속성을 기본으로 가진다.
2. Statement
본 절에서는 파일과 연관된 statement에 대해 설명한다.
2.1. OPEN statement
OPEN statement는 지정한 파일을 연다.
open-options :
항목 | 설명 |
---|---|
FILE |
대상이 되는 파일을 기술한다. |
FILE 속성 |
자세한 설명은 "File"을 참고한다. |
TITLE |
JCL에 기술된 외부 데이터 셋의 DD 이름을 지정한다. |
LINESIZE |
한 라인의 길이를 정의한다. 스트림이 LINESIZE에 지정한 값를 넘을 경우 다음 라인의 첫 번째 컬럼으로 이동한다. LINESIZE 옵션은 STREAM OUTPUT 파일에만 사용할 수 있다. (기본값: 120) |
PAGESIZE |
한 페이지당 라인의 개수를 정의한다. 라인의 크기가 PAGESIZE의 값을 넘을 경우 ENDFILE 조건이 발생한다. PUT statement에서 PAGE format item이나 PAGE 옵션을 사용하여 새로운 페이지로 시작할 수 있다. (기본값: 60) |
파일을 열기 위해서는 명시적으로 OPEN statement를 사용하거나, 파일이 열려 있지 않은 상태에서 READ, WRITE, REWRITE, DELETE, LOCATE, PUT, GET statement를 사용할 때 내부적으로 열린다. OPEN statement로 명시적으로 열 때 FILE 속성을 정의하여 DECLARE할 때 정의한 FILE 속성을 재정의할 수 있다.
다음은 OPEN statement를 사용하여 FILE 속성을 재정의하는 예제이다.
DECLARE TEST FILE RECORD OUTPUT; OPEN FILE(TEST) STREAM INPUT; CLOSE FILE(TEST); OPEN FILE(TEST);
첫 번째 OPEN statement에서 TEST는 STREAM, INPUT 속성을 가진다. 파일을 닫게 되면 열 때 적용한 FILE 속성은 사라지게 되고, 다음에 열 때에는 적용되지 않는다. 따라서 두 번째 OPEN statement에서는 DECLARE statement에서 지정한 RECORD, OUTPUT 속성을 가진다.
선언할 때 정의한 FILE 속성과 열 때 정의한 FILE 속성이 충돌날 경우 에러가 발생한다. |
3. Record I/O
Record I/O는 데이터를 변환없이 스토리지 상에 존재하는 그대로 처리하는 방식이다.
Record I/O는 Consecutive, Indexed, Relative 데이터셋을 사용할 수 있으며, 순차적으로 입출력하거나 키를 사용하여 임의적으로 입출력할 수 있다. 또한 하나의 레코드에 대하여 값을 변수에 저장하거나 쓸 수 있으며, 포인터로 접근할 수 있다.
3.1. READ statement
READ statement는 데이터 셋으로부터 레코드를 읽어온다. 읽어 온 레코드를 지정한 변수에 저장하거나 포인터(pointer)로 지정할 수 있다.
항목 | 설명 |
---|---|
FILE |
읽어올 파일을 지정한다. 파일은 INPUT 또는 UPDATE 속성을 가져야 한다. |
IGNORE |
표현식 값만큼 레코드를 무시한다. 계산된 표현식 값이 n이면 IGNORE 옵션을 수행한 뒤에는 n+1번째 레코드를 읽는다. |
INTO |
읽어온 레코드를 지정한 변수에 저장한다. 변수가 배열이나 구조체일 경우 반드시 스토리지 상에 연결되어 있어야 한다. |
SET |
읽어온 레코드를 지정한 포인터로 가리키게 한다. |
KEY |
지정한 KEY에 해당하는 레코드를 읽어온다. KEY 옵션을 사용하기 위해서는 파일은 DIRECT 속성을 가지거나 SEQUENTIAL KEYED 속성을 가져야 한다. |
KEYTO |
레코드를 읽어올 때 해당 레코드의 키 값도 같이 읽어온다. KEYTO 옵션을 사용하기 위해서는 파일은 SEQUENTIAL KEYED 속성을 가져야 한다. |
3.2. WRITE statement
WRITE statement는 데이터 셋에 레코드를 쓴다.
항목 | 설명 |
---|---|
FILE |
기록할 파일을 지정한다. 파일은 OUTPUT 또는 UPDATE 속성을 가져야 한다. |
FROM |
레코드를 기록할 변수를 지정한다. 변수가 배열이나 구조체일 경우 반드시 스토리지 상에 연결되어 있어야 한다. |
KEYFROM |
기록할 레코드의 키를 지정한다. KEYFROM 옵션을 사용하기 위해서는 파일은 KEYED 속성을 가져야 한다. Indexed 데이터 셋에서는 KEYFROM의 값이 CHARACTER로 변환되고, Relative 데이터 셋에서는 FIXED DECIMAL로 변환된다. |
KEYTO |
레코드를 기록할 때 다음 기록될 키 값을 저장한다. KEYTO 옵션을 사용하기 위해서는 파일은 SEQUENTIAL KEYED 속성을 가져야 한다. |
3.3. DELETE statement
DELETE statement는 데이터 셋으로부터 레코드를 삭제한다.
항목 | 설명 |
---|---|
FILE |
삭제할 파일을 지정한다. 파일은 반드시 UPDATE 속성을 가져야 한다. |
KEY |
지정한 KEY에 해당하는 레코드를 삭제한다. KEY 옵션을 사용하기 위해서는 파일은 DIRECT 속성을 가지거나 SEQUENTIAL KEYED 속성을 가져야 한다. |
3.4. REWRITE statement
REWRITE statement는 데이터 셋의 레코드를 갱신한다.
항목 | 설명 |
---|---|
FILE |
갱신할 파일을 지정한다. 파일은 반드시 UPDATE 속성을 가져야 한다. |
FROM |
레코드를 기록할 변수를 지정한다. 변수가 만일 배열이나 구조체일 경우 반드시 스토리지 상에 연결되어 있어야 한다. |
KEY |
지정한 KEY에 해당하는 레코드를 갱신한다. KEY 옵션을 사용하기 위해서는 파일은 DIRECT 속성을 가지거나 SEQUENTIAL KEYED 속성을 가져야 한다. |
3.5. LOCATE statement
LOCATE statement는 다음에 기록할 Output buffer의 위치를 기저부 변수(Based variable)을 통해 접근할 수 있도록 포인터(pointer)로 지정한다.
항목 | 설명 |
---|---|
FILE |
대상 파일을 지정한다. 파일은 반드시 OUTPUT SEQUENTIAL BUFFERED 속성을 가져야 한다. |
based variable |
Output buffer로 접근할 수 있는 기저부 변수를 정의한다. |
SET |
Output buffer의 주소를 저장할 포인터를 지정한다. |
KEYFROM |
기록할 레코드의 키를 지정한다. KEYFROM 옵션을 사용하기 위해서는 파일은 KEYED 속성을 가져야 한다. Indexed 데이터 셋에서는 KEYFROM의 값이 CHARACTER로 변환되고, Relative 데이터 셋에서는 FIXED DECIMAL로 변환된다. |
레코드는 LOCATE statement를 수행할 시점에 기록되지 않고, FLUSH statement를 사용하여 버퍼를 비우거나 다음 LOCATE statement를 수행할 때 기록된다. 따라서 LOCATE statement를 수행하더라도 데이터 셋에 기록될 레코드는 기저부 변수를 통해 계속 수정될 수 있다. |
4. Stream I/O
Stream I/O는 데이터를 문자열 형태로 변환하고 여러 데이터들을 스트림 형태로 만들어 처리하는 방식이다. 스트림(Stream)은 문자열로 변환된 데이터들이 연속적으로 저장된 공간이다. 스트림은 데이터셋의 레코드 길이만큼 데이터셋으로부터 읽거나 쓰며, 만일 스트림이 여러 개의 레코드로 나눠진다고 해도 내부적으로 하나의 스트림으로 만들어 처리한다.
Stream I/O는 반드시 Consecutive 데이터셋에서만 사용가능하고, 순차적인 I/O만 가능하다. Stream I/O에서는 GET, PUT statement를 이용하여 3가지 방식으로 스트림으로 만들거나 스트림에서 읽을 수 있다.
본 절에서는 GET, PUT statement와 3가지 방식에 대해 설명한다.
4.1. GET statement
GET statement는 스트림으로부터 레코드를 읽어온다. 스트림은 데이터 셋의 레코드나 문자열에서 가져올 수 있다.
데이터 셋으로부터 데이터를 읽을 경우 GET statement의 문법은 다음과 같다.
항목 | 설명 |
---|---|
FILE |
대상 파일을 지정한다. 만약 파일이 생략될 경우 SYSIN 파일이 지정된다. |
data-specification |
Data specification을 참고한다. |
COPY |
읽어들인 스트림을 지정된 파일에 그대로 저장한다. 만일 파일이 생략될 경우 SYSPRINT 파일이 지정된다. |
SKIP (expression) |
표현식 값만큼 데이터를 건너뛰고 다음 데이터를 가져온다. 표현식이 생략될 경우 기본값은 1이다. |
문자열으로부터 데이터를 읽을 경우 GET statement의 문법은 다음과 같다.
항목 | 설명 |
---|---|
STRING |
대상 문자열을 지정한다. |
data-specification |
Data specification을 참고한다. |
4.2. PUT statement
PUT statement는 레코드를 스트림으로 생성한다. 스트림은 데이터 셋의 레코드나 문자열에 저장될 수 있다.
데이터 셋으로 데이터를 저장할 경우 PUT statement의 문법은 다음과 같다.
항목 | 설명 |
---|---|
FILE |
대상 file을 지정한다. 파일이 생략될 경우 SYSPRINT 파일이 지정된다. |
data-specification |
Data specification을 참고한다. |
SKIP (expression) |
표현식 값만큼 라인을 건너뛴다. 표현식이 생략될 경우 기본값은 1이다. |
LINE (expression) |
표현식 값에 해당하는 라인으로 이동한다. LINE 옵션을 사용하기 위해서는 반드시 파일에 PRINT 속성이 정의되어 있어야 한다. |
PAGE |
새로운 페이지를 시작한다. 라인은 1로 초기화된다. PAGE 옵션을 사용하기 위해서는 반드시 파일에 PRINT 속성이 정의되어 있어야 한다. |
문자열로 데이터를 저장할 경우 PUT statement의 문법은 다음과 같다.
항목 | 설명 |
---|---|
STRING |
대상 문자열을 지정한다. |
data-specification |
Data specification을 참고한다. |
4.3. Data specification
GET, PUT statement의 data specification에 대한 문법은 다음과 같다.
data list :
format list :
항목 | 설명 |
---|---|
LIST |
자세한 내용은 List-directed I/O를 참고한다. |
DATA |
자세한 내용은 Data-directed I/O를 참고한다. |
EDIT |
자세한 내용은 Edit-directed I/O를 참고한다. |
data-list item |
|
data-list DO Type 3 |
DO statement Type3의 문법을 참고한다. DO Type 3은 괄호로 묶여 여러 번 중첩될 수 있다. 아래의 예제를 참고한다. |
format list |
Format 항목에 대한 설명은 Format Item을 참고한다. |
data-list DO Type 3에 대한 예제는 다음과 같다.
PUT LIST(((A(I,J), B(I,J) DO I = 1 TO 3) DO J = 3 TO 4));
DO J = 3 TO 4 문장이 가장 바깥쪽의 반복문이고, DO I = 1 TO 3 문장이 안쪽 반복문, 제일 안쪽에 A(I,J), B(I,J)가 do-group이 된다. 따라서 위의 예제는 다음의 예제와 동일하다.
DO J = 3 TO 4; DO I = 1 TO 3; PUT LIST(A(I,J), B(I,J)); END; END;
4.3.1. List-directed I/O
List-directed I/O는 데이터들을 순차적으로 처리한다. 데이터들은 타입에 따라 변환 룰에 의해 변환되고, 각 데이터들은 공백으로 구분되어 I/O된다.
-
List-directed input
-
데이터가 Character일 경우 둘러쌓인 따옴표를 제거하고 저장된다.
-
데이터가 산술 상수(arithmetic constant)일 경우 base, scale, mode, precision은 실제 저장될 data-list 항목의 속성을 따른다.
-
다음은 List-directed input을 사용하는 예이다.
GET LIST(A,B,C,D);
Stream I/O의 큰 특징은 하나의 statement로 여러개의 데이터들을 처리할 수 있다는 것이다.
위의 예는 다음의 예와 동일하다.
GET LIST(A); GET LIST(B); GET LIST(C); GET LIST(D);
스트림에 데이터가 다음과 같이 존재한다면 A, B, C, D에 각각 100, 90, 80, 70이 저장된다.
100 90 80 70
스트림의 데이터와 저장될 변수의 타입이 다를 경우 변환이 일어나며, 변환이 실패할 경우 CONVERSION 조건이 발생한다.
-
-
List-directed output
-
data-list 항목들은 문자열로 변환되어 스트림으로 생성된다.
-
항목이 산술 상수일 경우 변환 룰에 따라 문자열로 변환되어 생성된다.
-
항목이 Bit일 경우 데이터의 처음과 끝에 따옴표를 추가하고 제일 마지막에 문자 B를 추가하여 생성된다.
-
항목이 Character일 경우 파일이 PRINT속성의 존재 여부에 따라 차이가 있다.
-
파일에 PRINT 속성이 없을 경우 데이터의 처음과 끝에 따옴표를 추가하여 생성된다.
-
파일에 PRINT 속성이 있을 경우 따옴표를 추가하지 않는다.
-
-
다음은 List-directed output을 사용하는 예이다.
DCL A FIXED DEC INIT(15); DCL B CHAR(4) INIT('TEST'); DCL C BIT(8) INIT('11110000'); PUT LIST(A,B,C);
위의 예제에 대한 생성된 스트림은 다음과 같다.
15 TEST '11110000'B
PUT statement에서 FILE 옵션이 지정되어 있지 않을 경우 기본으로 SYSPRINT가 지정되고 SYSPRINT는 PRINT 속성을 가지기 때문에 Character 문자열에 따옴표가 추가되어 있지 않은 것을 볼 수 있다.
List-directed output에서는 참조뿐만 아니라 표현식도 가능하다.
-
다음은 여러 표현식에 대한 예제와 결과이다.
PUT LIST('AB' || 'CD', 5 * 15, 1.5E+2);
ABCD 75 1.5E+0002
-
4.3.2. Data-directed I/O
Data-directed I/O의 스트림 데이터는 data-list 항목의 이름과 값으로 구성되며, 항목의 이름과 값은 문자 '='을 기준으로 구분된다.
Data-directed I/O로 인해 생성되는 스트림 데이터의 문법은 다음과 같다.
-
Data-directed input
-
List-directed input과 달리 데이터들은 순서대로 항목에 저장되지 않고, 데이터의 이름 부분과 항목의 이름이 동일해야 저장된다. 또한 GET statement에 나오는 항목만큼 데이터를 읽어 처리하는 List-directed input과 달리 Data-directed input은 세미콜론(;) 단위로 스트림을 읽어 처리한다.
-
다음은 Data-directed input에 대한 예제이다.
GET DATA(A,B,C,E);
만일 스트림에 데이터가 다음과 같이 존재한다면 A, B, C에 각각 10, 20, 30이 저장될 것이다.
B= 20 A= 10 C= 30 D= 40;
데이터의 이름이 항목의 이름과 일치할 경우 데이터에서 이름과 문자 '='을 제외한 값만 저장된다. 스트림의 세미콜론 전까지 데이터들의 순서는 중요하지 않다. E는 data-list에 존재하지만 스트림에 존재하지 않기 때문에 E의 값은 변화하지 않는다. 스트림에는 존재하지만 data-list에 존재하지 않는 D는 무시된다. 만일 data-list에 배열이나 구조체가 올 경우 지원되지 않는다.
-
-
Data-directed output
-
data-list들의 이름과 값은 문자열로 변환되어 스트림에 저장된다.
-
data-list에 배열이나 구조체가 올 경우 데이터 이름에 subscript나 qualified name이 포함된다.
-
다음은 배열과 구조체에 대한 data-directed output에 대한 예제이다.
DCL A(3) CHAR(2) INIT('12','34','56'); DCL 1 B, 2 C FIXED DEC INIT(3), 2 D, 3 E FIXED DEC INIT(5); PUT DATA(A, B);
위의 예제로 생성된 스트림은 다음과 같다.
A(1)='12' A(2)='34' A(3)='56' B.C= 3 B.D.E= 5;
한 번의 PUT statement가 끝날 경우 해당 스트림의 세미콜론이 들어가게 되며, 세미콜론은 data-direct input에서 한 번의 GET statement를 수행했을 때 스트림을 읽는 기준이 된다.
-
4.3.3. Edit-directed I/O
Edit-directed I/O는 format을 지정하여 데이터를 처리한다. data-list 항목들은 지정한 format에 맞게 변환된다. Control Format은 data-list 항목과 매칭되지 않고, 데이터 사이에 공백이나 줄바꿈 같은 역할을 한다. Format에 대한 자세한 설명은 Format Item을 참고한다.
Edit-directed I/O에서 data-list 항목과 format 항목의 개수가 일치하지 않을 수 있다.
다음의 예제를 참고한다.
PUT EDIT(A,B,C)(A(4),F(15,6));
Data-list 항목의 개수는 A,B,C로 3개이지만, format 항목의 개수는 A(4), F(15)로 2개이다. 만일 format의 끝에 도달하면 다시 format의 처음으로 되돌아간다. 따라서 C는 A(4)의 format으로 출력된다.
PUT EDIT(A,B)(A(4),F(15,6),B(8));
위와 같이 format 항목의 개수가 더 많을 경우 남는 format 항목들은 무시된다. 따라서 B(8) format은 사용되지 않는다.
format 항목은 iteration factor로 해당 format 항목을 지정한 횟수만큼 반복할 수 있다.
-
Edit-directed input
-
Edit-directed input은 List-directed input, data-directed input과 다르게 공백으로 데이터를 구분하지 않는다. 스트림의 존재하는 모든 문자들은 데이터에 포함되고, 사용자가 직접 format 항목을 이용해 데이터를 구분해야 한다.
-
다음은 edit-directed input에 대한 예제이다.
GET EDIT(A,B,C)(A(4),A,X(4),F(6,2));
위의 예제는 다음과 같이 처리된다.
-
스트림에서 4 character를 A에 저장한다.
-
B의 길이만큼 스트림에서 읽어 B에 저장한다.
-
다음 4 character는 무시한다.
-
다음 6 character는 fixed-point format으로 C에 저장한다.
-
-
-
Edit-directed output
-
Edit-directed output은 List-directed input, data-directed input과 다르게 데이터 사이에 공백을 삽입하지 않는다. 지정한 format 항목 대로 해당 데이터를 스트림에 저장한다.
-
다음은 edit-directed output에 대한 예제이다.
PUT EDIT(A,B,'edit direct')(SKIP(1),A(2),X(4),F(15,4),COL(30),A(11));
위의 예제는 다음과 같이 처리된다.
-
한 라인이 skip된다.
-
A를 2 character로 변환하여 스트림에 저장한다. 만일 A의 길이가 2보다 크면 큰 부분은 절단된다.
-
공백을 4 character만큼 스트림에 저장한다.
-
B를 fixed-point 타입으로 digit 15, precision 4로 변환하여 스트림에 저장한다.
-
'edit direct' 문자열은 column position 30에 길이 11만큼 스트림에 저장된다.
-
-
FORMAT statement
FORMAT statement에 대한 자세한 내용은 FORMAT statement를 참고한다.
4.4. Format Item
Format 항목은 3가지 유형으로 나눌 수 있다.
-
Control format 항목
-
데이터셋의 레이아웃과 관련된 format 항목
-
COLUMN, LINE, PAGE, SKIP, X format 항목
-
-
Data format 항목
-
data-list 항목을 I/O 하기 위한 format 항목
-
A, B, E, F, P format 항목
-
-
Remote format 항목
-
format list를 지정하기 위한 format 항목이다.
-
R format 항목
-
4.4.1. A-format
A format은 Character를 출력하기 위한 데이터 format이다.
-
input에서는 길이를 지정할 경우 스트림에서 해당 길이만큼 읽어오며, 지정하지 않을 경우 data-list 항목의 길이만큼 스트림에서 읽는다.
-
output에서는 길이를 지정할 경우 해당 길이만큼 스트림에 저장하며, 만일 A format에 지정한 길이가 data-list 항목이 길이보다 작거나 크면, truncate나 padding이 된다. 길이를 지정하지 않을 경우 data-list 항목의 길이만큼 스트림에 저장한다.
항목 | 설명 |
---|---|
field-width |
Character의 길이를 지정한다. 해당 값은 정수로 변환되며, 음수가 될 수 없다. 만일 field-width가 생략되면, 기본값은 데이터의 길이가 된다. |
4.4.2. B-format
B format을 bit를 출력하기 위한 데이터 format이다.
-
input에서는 B format이 아직 지원되지 않는다.
-
output에서는 데이터를 bit로 변환하여 스트림에 저장한다. 변환 룰은 데이터 변환을 참고한다.
항목 | 설명 |
---|---|
field-width |
Bit의 길이를 지정한다. 해당 값은 정수로 변환되며, 음수가 될 수 없다. 만일 field-width가 생략되면, 기본값은 데이터의 길이가 된다. |
4.4.3. COLUMN format
COLUMN format은 라인의 지정한 column으로 position을 이동하는 control format이다.
-
input에서는 해당 위치로 position을 이동하며, 그 사이의 값들은 무시한다.
-
output에서는 해당 위치로 position을 이동하며, 그 사이에는 공백이 삽입된다.
항목 | 설명 |
---|---|
character-position |
Position을 지정한다. 해당 값은 정수로 변환되며, 음수가 될 수 없다. |
4.4.4. E-format
E format은 floating-point를 출력하기 위한 데이터 format이다.
-
input에서는 E format이 아직 지원되지 않는다.
-
output에서는 데이터를 floating-point로 변환하여 스트림에 저장하며, 만일 E format에 지정한 길이가 데이터의 길이보다 작거나 크면, truncate나 padding이 된다. 길이를 지정하지 않을 경우 data-list 항목의 길이만큼 스트림에 저장한다.
항목 | 설명 |
---|---|
field-width |
Float-point의 길이를 지정한다. 해당 값은 정수로 변환되며, 음수가 될 수 없다. |
4.4.5. F-format
F format은 fixed-point를 출력하기 위한 데이터 format이다.
-
input에서는 F format이 아직 지원되지 않는다.
-
output에서는 데이터를 fixed-point로 변환하여 스트림에 저장한다.
항목 | 설명 |
---|---|
field-width |
Fixed-point의 길이를 지정한다. 해당 값은 정수로 변환되며, 음수가 될 수 없다. |
fractional-digits |
Fixed-point의 가수 길이를 지정한다. 해당 값은 정수로 변환되며, 음수가 될 수 없고, field-width의 값보다 클 수 없다. 만일 fractional-digits가 생략되면, 기본값은 0이다. |
scaling-factor |
Fixed-point의 계수를 지정한다. scaling-factor의 값만큼 10을 곱한다. 만일 scaling-factor의 값이 음수이면, 해당 값만큼 10을 나눈다. |
4.4.6. LINE format
LINE format은 지정한 라인으로 position을 이동하는 control format이다.
-
input에서는 LINE format을 사용할 수 없다.
-
output에서는 지정한 라인으로 position을 이동하며, 그 사이에는 공백 라인이 삽입된다.
항목 | 설명 |
---|---|
line-number |
이동할 특정 라인을 지정한다. 해당 값은 정수로 변환되며, 음수가 될 수 없다. |
4.4.7. P-format
P format은 picture를 출력하기 위한 데이터 format이다.
-
input에서는 P format이 아직 지원되지 않는다.
-
output에서는 데이터를 지정한 picture format으로 변환하여 스트림에 저장한다.
항목 | 설명 |
---|---|
picture-specification |
Picture rule을 지정한다. 자세한 사항은 Picture specification를 참고한다. |
4.4.8. PAGE format
PAGE format은 새 page를 시작하기 위한 control format이다.
-
input에서는 PAGE format을 사용할 수 없다.
-
output에서는 새로운 페이지가 시작되고 라인은 1로 초기화된다.
4.4.9. R-format
R format은 FORMAT statement의 format list를 지정하기 위한 remote format이다.
항목 | 설명 |
---|---|
label-reference |
FORMAT statement의 label을 지정한다. |
label-reference가 label variable일 경우 아직 지원되지 않는다.
다음은 edit-directed output에서 R format을 이용하여 FORMAT statement의 format list를 사용하는 예제이다.
lbl1:FORMAT(A(4), X(2)); PUT EDIT(A,B,C,D)(A(2),F(15),R(lbl1),A);
위의 PUT statement는 다음 예제와 동일하다.
PUT EDIT(A,B,C,D)(A(2),F(15),A(4),X(2),A);