COBOL for Mainframe
Fundamentals
Ch7 文件I/O处理
文件处理
ENVIRONMENT DIVISION
INPUT-OUTPUT SECTION.
FILE-CONTROL.
DATA DIVISION
FILE SECTION.
FD
PROCEDURE DIVISION
OPEN
CLOSE
READ
WRITE
REWRITE :替换一个记录.
DELETE :删除一个记录.
START :定位到关系文件或索引文件中的一个记录,顺序访问从该位置开
始.
ENVIRONMENT DIVISION
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT [optional] file-name
ASSIGN TO ddname
[ORGINAZATION IS SEQUENTIAL|INDEXED|RELATIVE]
[ACCESS MODE IS SEQUENTIAL|RANDOM|DYNAMIC]
[RECORD KEY IS identifier-1]
[ALTERNATE RECORD KEY IS identifier-2]
[FILE STATUS IS identifier-3]
FILE STATUS 是两位数字,标志文件的状态, 例如:
00 成功 10 读到文件尾 30 I/O 错误…
可以找到一个数组,包含26种状态的相信信息.
例子
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INFILE ASSIGN TO FILE1
FILE STATUS IS FS1.
SELECT OUTFILE ASSIGN TO FILE2
FILE STATUS IS FS2.
INFILE 在FILE SECTION里定义
FILE1 是 JCL 里用到的ddname
FS1 在WORKING-STORAGE SECTION里定义
DATA DIVISION
DATA DIVISION.
FILE SECTION.
FD file-name
[RECORD MODE IS F|V]
[BLOCK CONTAINS n RECORDS]
[RECORD CONTAINS n CHARACTERS]
*下面定义的是该文件的记录缓冲器(Record Buffer),是内存与外部
*文件的唯一通道和桥梁。它的结构必须和文件中的单条记录吻合。
01 data-item-name.
05….
05….
例子
DATA DIVISION
FILE SECTION.
FD INFILE.
01 INREC.
05 USERID PIC X(10).
05 FILLER PIC X.
05 PWD PIC X(10).
01 OUTREC.
05 USERID PIC X(10).
05 FILLER PIC X.
05 RESULT PIC X(10).
...
WORKING-STORAGE SECTION.
01 WK-AREA PIC X(21).
01 FS1 PIC 9(2).
01 FS2 PIC 9(2).
OPEN 语句
语法:
OPEN INPUT|OUTPUT|I-O|EXTEND file-name-1, file-name-2.
例子:
OPEN INPUT INFILE1 INFILE2.
OPEN OUTPUT OUTFILE.
什么时候用 INPUT, OUTPUT, 或I-O?
CLOSE 语句
语法:
CLOSE file-name-1, file-name-2,…
[WITH LOCK],如果选用,则一个程序中同一个文件只能被打开一次.
例子:
CLOSE INFILE1 INFILE2.
CLOSE OUTFILE.
READ 语句
语法:
READ file-name-1 [NEXT] [RECORD]
[INTO identifier-1]
[AT END statement-1]
[NOT AT END statement-2]
[END-READ]
例子:
READ INFILE
AT END MOVE 'Y' TO FLAG
END-READ.
READ INFILE INTO WK-AREA.
WRITE 语句
语法:
WRITE date-item-1
[FROM identifier-1]
[BEFORE|AFTER ADVANCING [n LINE|LINES]|[PAGE]]
[END-WRITE]
例子:
WRITE OUTREC.
WRITE OUTREC FROM WK-AREA.
WRITE OUTREC AFTER ADVANCING 2 LINES.
REWRITE 语句
如果设备支持记录替换,则用于替换一个记录。之前必须有一次成功
读取.
语法:
REWRITE date-item-1
[FROM identifier-1]
[END-REWRITE]
例子:
OPEN I-O INFILE. (only when the file is opened as I-O,you can use rewrite in the following)
...
PERFORM UNTIL FLAG = 'Y'
READ INFILE
AT END MOVE 'Y' TO FLAG
END-READ
IF FS1 NOT = 00 AND FS1 NOT = 10 (should be FS1 = 00 )
THEN
MOVE SPACES TO PWD
REWRITE INREC
IF FS1 NOT = 00
THEN
DISPLAY 'REWRITE ERROR'
END-IF
END-IF
END-PERFORM
文件排序与合并
所有的排序和合并文件都是临时文件. 这些临时文件在FILE
SECTION 由SD 定义。
排序与合并的输出可以写到一个文件里,也可以只是在程序中
处理。
ENVIRONMENT DIVISION
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT sort-file ASSIGN TO assign-name.
DATA DIVISION
DATA DIVISION.
FILE SECTION.
SD sort-file
[RECORD CONTAINS n1 [TO n2 ] CHARACTERS]
01 sort-rec.
05…
05…
PROCEDURE DIVISION
SORT 语句
MERGE 语句
RELEASE 语句 (类似与真实文件的 WRITE )
RETURN 语句 (类似于真实文件的 READ)
SORT 语句
SORT sort-file
{ ON ASCENDING | DESCENDING KEY { identifier-1} }
[WITH DUPLICATE IS ORDER]
INPUT PROCEDURE IS proc-name-1 [THRU proc-name-2]
USING { file-name-1 }
OUTPUT PROCEDURE IS proc-name-3 [THRU proc-name-4]
GIVING { file-name-2 }
RELEASE 语句
语法:
RELEASE sort-rec [FROM identifier]
RETURN 语句
语法:
RETURN sort-file RECORD [ INTO identifier]
[AT END statement-1]
[NOT AT END statement-2]
[END-RETURN]
MERGE 语句
MERGE sort-file
{ ON ASCENDING | DESCENDING KEY { identifier-1} }
USING { file-name-1, file-name-2 }
OUTPUT PROCEDURE IS proc-name-3 [THRU proc-name-4]
GIVING { file-name-2 }
例子 1
FD SalesFile.
01 SalesRec.
02 FILLER PIC X(10).
SD WorkFile.
01 WorkRec.
02 WSalesmanNum PIC 9(5).
02 FILLER PIC X(5).
FD SortedSalesFile.
01 SortedSalesRec.
02 SalesmanNum PIC 9(5).
02 ItemType PIC X.
02 QtySold PIC 9(4).
PROCEDURE DIVISION.
Begin.
SORT WorkFile ON ASCENDING KEY WSalesmanNum
USING SalesFile
GIVING SortedSalesFile.
...
输入程序
例子
FD SalesFile.
01 SalesRec. SelectHatSales.
88 EndOfSales VALUE HIGH-VALUES. OPEN INPUT SalesFile
02 FILLER PIC 9(5). READ SalesFile
02 FILLER PIC X. AT END SET EndOfSales TO TRUE
88 HatRecord VALUE 'H'. END-READ
02 FILLER PIC X(4).
PERFORM UNTIL EndOfSales
SD WorkFile.
IF HatRecord
01 WorkRec.
02 WSalesmanNum PIC 9(5). RELEASE WorkRec FROM SalesRec
02 FILLER PIC X(5). END-IF
FD SortedSalesFile. READ SalesFile
01 SortedSalesRec. AT END SET EndOfSales TO TRUE
02 SalesmanNum PIC 9(5). END-READ
02 ItemType PIC X. END-PERFORM
02 QtySold PIC 9(4). CLOSE SalesFile.
PROCEDURE DIVISION.
Begin.
SORT WorkFile
ON ASCENDING KEY WSalesmanNum
INPUT PROCEDURE IS SelectHatSales
GIVING SortedSalesFile.
输出程序
例子
FD SalesFile.
SummariseSales.
01 SalesRec PIC X(10).
OPEN OUTPUT SalesSummaryFile
SD WorkFile.
01 WorkRec. RETURN WorkFile
88 EndOfWorkFile AT END SET EndOfWorkFile TO TRUE
VALUE HIGH-VALUES. END-RETURN
02 WSalesmanNum PIC 9(5). PERFORM UNTIL EndOfWorkFile
02 FILLER PIC X. MOVE WSalesmanNum TO SalesmanNum
02 WQtySold PIC X(4). MOVE ZEROS TO TotalQtySold
PERFORM UNTIL WSalesManNum NOT =
FD SalesSummaryFile. SalesmanNum
01 SummaryRec. OR EndOfWorkFile
02 SalesmanNum PIC 9(5). ADD WQtySold TO TotalQtySold
02 TotalQtySold PIC 9(6). RETURN WorkFile
PROCEDURE DIVISION. AT END SET EndOfWorkFile TO TRUE
Begin. END-RETURN
SORT WorkFile END-PERFORM
ON ASCENDING KEY WSalesmanNum WRITE SummaryRec
USING SalesFile END-PERFORM
OUTPUT PROCEDURE
CLOSE SalesSummaryFile.
IS SummariseSales.
OPEN INPUT SalesSummaryFile.
PERFORM PrintSummaryReport.