COBOL 文件处理动词
文件处理动词用于对文件执行各种操作。以下是文件处理的动词:
- Open(打开)
- Read(读取)
- Write(写入)
- Rewrite(重写)
- Delete(删除)
- Start(启动)
- Close(关闭)
Open(打开)动词
打开动词是必须执行的第一个文件操作。如果打开成功,则只能对文件进行下一步操作。只有打开文件后,文件结构中的变量才可用于处理。每个文件操作后FILE STATUS变量都会更新。
语法
OPEN "mode" file-name.
在这里,文件名是字符串文字,你将用它来命名你的文件。文件可以在以下模式中打开:
模式 | 描述 |
---|---|
Input | 输入模式用于现有文件。在这种模式下,我们只能读取文件,不允许有其他操作。 |
Output | 输出模式用于在文件中插入记录。如果使用顺序文件并且文件保存有一些记录,则先删除现有的记录,然后将新记录插入文件。在索引文件和相对文件的情况下不会发生。 |
Extend | 扩展模式用于在顺序文件中附加记录。在这种模式下,记录被插入在文件末尾。如果文件的访问模式是随机或动态,那么扩展模式不能使用。 |
I-O | 输入-输出模式用于读取和重写的文件的记录。 |
Read(读取)动词
读取动词是用于读取文件记录。读取功能是从文件中获取记录。在每个读取动词中,只有一个记录可以读入文件结构。要执行读操作,请在INPUT或I-O模式下打开文件。在每个读取语句中,文件指针递增,因此可读取连续的记录。
语法
以下是当文件访问模式是顺序时读取记录的语法:
READ file-name NEXT RECORD INTO ws-file-structureAT END DISPLAY 'End of File'NOT AT END DISPLAY 'Record Details:' ws-file-structureEND-READ.
下面是所使用的参数:
- NEXT RECORD是可选的,在顺序读取索引顺序文件时指定。
- INTO子句是可选的。ws-file-structure在工作存储节中定义,以从READ语句中获取值。
- 当到达文件末尾时,AT END条件为true。
例:以下示例使用行顺序组织读取现有文件。这个程序可以使用Try it选项进行编译和执行,它将显示文件中存在的所有记录。
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-STUDENTAT END MOVE 'Y' TO WS-EOFNOT AT END DISPLAY WS-STUDENTEND-READEND-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-structureKEY IS rec-keyINVALID KEY DISPLAY 'Invalid Key'NOT INVALID KEY DISPLAY 'Record Details: ' ws-file-structureEND-READ.
例:以下示例使用索引组织读取现有文件。这个程序可以使用大型机上的JCL进行编译和执行,它将显示文件中存在的所有记录。在大型机服务器上,我们不使用文本文件,而是使用PS文件。
我们假设存在于大型机上的文件与上述示例中的input.txt文件具有相同的内容。
IDENTIFICATION DIVISION.PROGRAM-ID. HELLO.ENVIRONMENT DIVISION.INPUT-OUTPUT SECTION.FILE-CONTROL.SELECT STUDENT ASSIGN TO IN1ORGANIZATION IS INDEXEDACCESS IS RANDOMRECORD KEY IS STUDENT-IDFILE 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-FILEKEY IS STUDENT-IDINVALID KEY DISPLAY 'Invalid Key'NOT INVALID KEY DISPLAY WS-STUDENT-FILEEND-READ.CLOSE STUDENT.STOP RUN.
JCL执行上述COBOL程序:
//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语句可以与FROM选项一起使用,直接从工作存储变量写入记录。From是一个可选子句。如果访问模式是顺序的,则要写入记录,文件必须在输出模式或扩展模式下打开。如果访问模式是随机或动态的,则要写入记录,文件必须在输出模式或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 OUT1ORGANIZATION IS SEQUENTIALACCESS IS SEQUENTIALFILE STATUS IS FS.DATA DIVISION.FILE SECTION.FD STUDENT01 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-FILEEND-WRITE. CLOSE STUDENT.
STOP RUN.
JCL执行上述COBOL程序:
//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(重写)动词
重写动词用于更新记录。文件应在I-O模式下打开进行重写操作。只有在成功读取操作后才能使用它。重写动词覆盖读取的最后一条记录。
语法
以下是当文件组织是顺序时,读取记录的语法:
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.
**例:**以下示例显示如何更新我们在前面的写入步骤中插入的现有记录:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.ENVIRONMENT DIVISION.INPUT-OUTPUT SECTION.FILE-CONTROL.SELECT STUDENT ASSIGN TO IN1ORGANIZATION IS INDEXEDACCESS IS RANDOMRECORD KEY IS STUDENT-IDFILE STATUS IS FS.DATA DIVISION.FILE SECTION.FD STUDENT01 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 STUDENTKEY IS STUDENT-IDINVALID KEY DISPLAY ‘KEY IS NOT EXISTING’END-READ.MOVE 'Tim Dumais' TO NAME.REWRITE STUDENT-FILEEND-REWRITE.CLOSE STUDENT.
STOP RUN.
JCL执行上述COBOL程序:
//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(删除)动词
删除动词只能在索引和相对文件上执行。文件必须在I-O模式下打开。在顺序文件组织中,记录不能被删除。Read语句读取的最后一条记录在顺序访问模式的情况下可被删除。在随机访问模式下,指定记录键,然后执行删除操作。
语法
以下是删除记录的语法:
DELETE file-name RECORDINVALID 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 OUT1ORGANIZATION IS INDEXEDACCESS IS RANDOMRECORD KEY IS STUDENT-IDFILE STATUS IS FS.DATA DIVISION.FILE SECTION.FD STUDENT01 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 RECORDINVALID KEY DISPLAY 'Invalid Key'NOT INVALID KEY DISPLAY 'Record Deleted'END-DELETE.CLOSE STUDENT.
STOP RUN.
JCL执行上述COBOL程序:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
//OUT1 DD DSN=OUTPUT-FILE-NAME,DISP=SHR
当你编译和执行上面的程序,会产生以下结果:
Record Deleted
Start(启动)动词
启动动词只能在索引和相对文件上执行。它用于将文件指针放在特定的记录上。访问模式必须是顺序或动态的。文件必须在I-O或输入模式下打开。
语法
以下是将指针放在特定记录上的语法:
START file-name KEY IS [=, >, <, NOT, <= or >=] rec-keyINVALID KEY DISPLAY 'Invalid Key'NOT INVALID KEY DISPLAY 'File Pointer Updated'
END-START.
Close(关闭)动词
关闭动词用于关闭文件。执行关闭操作后,文件结构中的变量将不可用于处理。程序和文件之间的链接丢失。
语法
以下是关闭文件的语法:
CLOSE file-name.