- COBOL 教程
- COBOL - 首页
- COBOL - 概述
- COBOL - 环境设置
- COBOL - 程序结构
- COBOL - 基本语法
- COBOL - 数据类型
- COBOL - 基本动词
- COBOL - 数据布局
- COBOL - 条件语句
- COBOL - 循环语句
- COBOL - 字符串处理
- COBOL - 表处理
- COBOL - 文件处理
- COBOL - 文件组织
- COBOL - 文件访问模式
- COBOL - 文件处理动词
- COBOL - 子程序
- COBOL - 内部排序
- COBOL - 数据库接口
- COBOL 有用资源
- COBOL - 问答
- COBOL - 快速指南
- COBOL - 有用资源
COBOL - 文件处理动词
文件处理动词用于对文件执行各种操作。以下是文件处理动词:
- 打开 (Open)
- 读取 (Read)
- 写入 (Write)
- 改写 (Rewrite)
- 删除 (Delete)
- 开始 (Start)
- 关闭 (Close)
Open 动词
Open 是必须执行的第一个文件操作。如果 Open 成功,则只有后续操作才能在文件上进行。只有在打开文件后,文件结构中的变量才能用于处理。文件状态 (FILE STATUS) 变量在每次文件操作后都会更新。
语法
OPEN "mode" file-name.
这里,文件名是字符串文字,您将使用它来命名您的文件。文件可以以下列模式打开:
序号 | 模式及说明 |
---|---|
1 |
输入 (Input) 输入模式用于现有文件。在此模式下,我们只能读取文件,不允许对文件进行其他操作。 |
2 |
输出 (Output) 输出模式用于在文件中插入记录。如果使用顺序文件并且文件包含一些记录,则将首先删除现有记录,然后将新记录插入文件中。对于索引文件或相对文件,则不会发生这种情况。 |
3 |
扩展 (Extend) 扩展模式用于在顺序文件中追加记录。在此模式下,记录将插入到末尾。如果文件访问模式为随机 (Random) 或动态 (Dynamic),则不能使用扩展模式。 |
4 |
I-O 输入输出模式用于读取和改写文件的记录。 |
Read 动词
Read 动词用于读取文件记录。Read 的功能是从文件中获取记录。在每个 Read 动词中,只能将一条记录读入文件结构。要执行读取操作,请以 INPUT 或 I-O 模式打开文件。在每个 Read 语句中,文件指针都会递增,因此会读取连续的记录。
语法
以下是当文件访问模式为顺序时读取记录的语法:
READ file-name NEXT RECORD INTO ws-file-structure AT END DISPLAY 'End of File' NOT AT END DISPLAY 'Record Details:' ws-file-structure END-READ.
以下是使用的参数:
NEXT RECORD 是可选的,在顺序读取索引顺序文件时指定。
INTO 子句是可选的。ws-file-structure 在 WorkingStorage 部分定义,用于从 READ 语句获取值。
达到文件末尾时,AT END 条件变为 True。
示例 - 下面的示例使用行顺序组织读取现有文件。此程序可以使用在线演示选项编译和执行,它将显示文件中存在的所有记录。
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT STUDENT ASSIGN TO 'input.txt' ORGANIZATION IS LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD STUDENT. 01 STUDENT-FILE. 05 STUDENT-ID PIC 9(5). 05 NAME PIC A(25). WORKING-STORAGE SECTION. 01 WS-STUDENT. 05 WS-STUDENT-ID PIC 9(5). 05 WS-NAME PIC A(25). 01 WS-EOF PIC A(1). PROCEDURE DIVISION. OPEN INPUT STUDENT. PERFORM UNTIL WS-EOF='Y' READ STUDENT INTO WS-STUDENT AT END MOVE 'Y' TO WS-EOF NOT AT END DISPLAY WS-STUDENT END-READ END-PERFORM. CLOSE STUDENT. STOP RUN.
假设input.txt文件中可用的输入文件数据包含以下内容:
20003 Mohtashim M. 20004 Nishant Malik 20005 Amitabh Bachhan
编译并执行上述程序后,将产生以下结果:
20003 Mohtashim M. 20004 Nishant Malik 20005 Amitabh Bachhan
语法
以下是当文件访问模式为随机时写入记录的语法:
READ file-name RECORD INTO ws-file-structure KEY IS rec-key INVALID KEY DISPLAY 'Invalid Key' NOT INVALID KEY DISPLAY 'Record Details: ' ws-file-structure END-READ.
示例 - 下面的示例使用索引组织读取现有文件。此程序可以使用大型机的JCL编译和执行,它将显示文件中存在的所有记录。在大型机服务器上,我们不使用文本文件;而是使用 PS 文件。
让我们假设大型机上的文件与上述示例中的 input.txt 文件具有相同的内容。
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT STUDENT ASSIGN TO IN1 ORGANIZATION IS INDEXED ACCESS IS RANDOM RECORD KEY IS STUDENT-ID FILE STATUS IS FS. DATA DIVISION. FILE SECTION. FD STUDENT. 01 STUDENT-FILE. 05 STUDENT-ID PIC 9(5). 05 NAME PIC A(25). WORKING-STORAGE SECTION. 01 WS-STUDENT. 05 WS-STUDENT-ID PIC 9(5). 05 WS-NAME PIC A(25). PROCEDURE DIVISION. OPEN INPUT STUDENT. MOVE 20005 TO STUDENT-ID. READ STUDENT RECORD INTO WS-STUDENT-FILE KEY IS STUDENT-ID INVALID KEY DISPLAY 'Invalid Key' NOT INVALID KEY DISPLAY WS-STUDENT-FILE END-READ. CLOSE STUDENT. STOP RUN.
执行上述 COBOL 程序的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO //IN1 DD DSN = STUDENT-FILE-NAME,DISP=SHR
编译并执行上述程序后,将产生以下结果:
20005 Amitabh Bachhan
Write 动词
Write 动词用于在文件中插入记录。写入记录后,它将不再在记录缓冲区中可用。在将记录插入文件之前,请将值移动到记录缓冲区,然后执行 Write 动词。
Write 语句可以与FROM选项一起使用,以直接从工作存储变量写入记录。From 是一个可选子句。如果访问模式是顺序的,则要写入记录,文件必须以 Output 模式或 Extend 模式打开。如果访问模式是随机的或动态的,则要写入记录,文件必须以 Output 模式或 I-O 模式打开。
语法
以下是当文件组织为顺序时读取记录的语法:
WRITE record-buffer [FROM ws-file-structure] END-WRITE.
以下是当文件组织为索引或相对时读取记录的语法:
WRITE record-buffer [FROM ws-file-structure] INVALID KEY DISPLAY 'Invalid Key' NOT INVALID KEY DISPLAY 'Record Inserted' END-WRITE.
示例 - 下面的示例显示如何在组织为顺序时在新文件中插入新记录。
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT STUDENT ASSIGN TO OUT1 ORGANIZATION IS SEQUENTIAL ACCESS IS SEQUENTIAL FILE STATUS IS FS. DATA DIVISION. FILE SECTION. FD STUDENT 01 STUDENT-FILE. 05 STUDENT-ID PIC 9(5). 05 NAME PIC A(25). 05 CLASS PIC X(3). WORKING-STORAGE SECTION. 01 WS-STUDENT. 05 WS-STUDENT-ID PIC 9(5). 05 WS-NAME PIC A(25). 05 WS-CLASS PIC X(3). PROCEDURE DIVISION. OPEN EXTEND STUDENT. MOVE 1000 TO STUDENT-ID. MOVE 'Tim' TO NAME. MOVE '10' TO CLASS. WRITE STUDENT-FILE END-WRITE. CLOSE STUDENT. STOP RUN.
执行上述 COBOL 程序的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO //OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = (NEW,CATALOG,DELETE)
编译并执行上述程序后,它将向输出文件添加新记录。
1000 Tim 10
Rewrite 动词
Rewrite 动词用于更新记录。对于改写操作,文件应以 I-O 模式打开。它只能在成功执行 Read 操作后使用。Rewrite 动词会覆盖最后读取的记录。
语法
以下是当文件组织为顺序时读取记录的语法:
REWRITE record-buffer [FROM ws-file-structure] END-REWRITE.
以下是当文件组织为索引或相对时读取记录的语法:
REWRITE record-buffer [FROM ws-file-structure] INVALID KEY DISPLAY 'Invalid Key' NOT INVALID KEY DISPLAY 'Record Updated' END-REWRITE.
示例 - 下面的示例显示如何更新我们在之前的 Write 步骤中插入的现有记录:
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT STUDENT ASSIGN TO IN1 ORGANIZATION IS INDEXED ACCESS IS RANDOM RECORD KEY IS STUDENT-ID FILE STATUS IS FS. DATA DIVISION. FILE SECTION. FD STUDENT 01 STUDENT-FILE. 05 STUDENT-ID PIC 9(4). 05 NAME PIC A(12). 05 CLASS PIC X(3). WORKING-STORAGE SECTION. 01 WS-STUDENT. 05 WS-STUDENT-ID PIC 9(5). 05 WS-NAME PIC A(25). 05 WS-CLASS PIC X(3). PROCEDURE DIVISION. OPEN I-O STUDENT. MOVE '1000' TO STUDENT-ID. READ STUDENT KEY IS STUDENT-ID INVALID KEY DISPLAY ‘KEY IS NOT EXISTING’ END-READ. MOVE 'Tim Dumais' TO NAME. REWRITE STUDENT-FILE END-REWRITE. CLOSE STUDENT. STOP RUN.
执行上述 COBOL 程序的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO //IN1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR
编译并执行上述程序后,它将更新记录:
1000 Tim Dumais 10
Delete 动词
Delete 动词只能对索引文件和相对文件执行。文件必须以 I-O 模式打开。在顺序文件组织中,不能删除记录。在顺序访问模式下,将删除 Read 语句最后读取的记录。在随机访问模式下,请指定记录键,然后执行 Delete 操作。
语法
以下是删除记录的语法:
DELETE file-name RECORD INVALID KEY DISPLAY 'Invalid Key' NOT INVALID KEY DISPLAY 'Record Deleted' END-DELETE.
示例 - 删除现有记录:
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT STUDENT ASSIGN TO OUT1 ORGANIZATION IS INDEXED ACCESS IS RANDOM RECORD KEY IS STUDENT-ID FILE STATUS IS FS. DATA DIVISION. FILE SECTION. FD STUDENT 01 STUDENT-FILE. 05 STUDENT-ID PIC 9(4). 05 NAME PIC A(12). 05 CLASS PIC X(3). WORKING-STORAGE SECTION. 01 WS-STUDENT. 05 WS-STUDENT-ID PIC 9(5). 05 WS-NAME PIC A(25). 05 WS-CLASS PIC X(3). PROCEDURE DIVISION. OPEN I-O STUDENT. MOVE '1000' TO STUDENT-ID. DELETE STUDENT RECORD INVALID KEY DISPLAY 'Invalid Key' NOT INVALID KEY DISPLAY 'Record Deleted' END-DELETE. CLOSE STUDENT. STOP RUN.
执行上述 COBOL 程序的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO //OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR
编译并执行上述程序后,将产生以下结果:
Record Deleted
Start 动词
Start 动词只能对索引文件和相对文件执行。它用于将文件指针放在特定记录处。访问模式必须是顺序的或动态的。文件必须以 I-O 或 Input 模式打开。
语法
以下是将指针放在特定记录处的语法:
START file-name KEY IS [=, >, <, NOT, <= or >=] rec-key INVALID KEY DISPLAY 'Invalid Key' NOT INVALID KEY DISPLAY 'File Pointer Updated' END-START.
Close 动词
Close 动词用于关闭文件。执行 Close 操作后,文件结构中的变量将不可用于处理。程序和文件之间的链接将丢失。
语法
以下是关闭文件的语法:
CLOSE file-name.