文件处理动词( File Handling Verbs)
文件处理动词用于对文件执行各种操作。 以下是文件处理动词 -
- Open
- Read
- Write
- Rewrite
- Delete
- Start
- Close
打开动词
Open是必须执行的第一个文件操作。 如果Open成功,则只能对文件进行进一步操作。 只有在打开文件后,文件结构中的变量才可用于处理。 每次文件操作后都会更新FILE STATUS变量。
语法 (Syntax)
OPEN "mode" file-name.
这里,file-name是字符串文字,您将使用它来命名文件。 可以在以下模式下打开文件 -
Sr.No. | 模式和说明 |
---|---|
1 | Input 输入模式用于现有文件。 在这种模式下,我们只能读取文件,文件上不允许其他操作。 |
2 | Output 输出模式用于在文件中插入记录。 如果使用sequential file并且文件保留了一些记录,则将首先删除现有记录,然后在文件中插入新记录。 在indexed file或relative file情况下不会发生这种情况。 |
3 | Extend 扩展模式用于在sequential file追加记录。 在此模式下,最后会插入记录。 如果文件访问模式是Random或Dynamic ,则不能使用扩展模式。 |
4 | IO 输入输出模式用于读取和重写文件的记录。 |
阅读动词
读动词用于读取文件记录。 read的功能是从文件中获取记录。 在每个读动词中,只能将一个记录读入文件结构。 要执行读取操作,请在INPUT或IO模式下打开文件。 在每个读取语句中,文件指针递增,因此读取连续记录。
语法 (Syntax)
以下是在文件访问模式顺序时读取记录的语法 -
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。
Example - 以下示例使用行顺序组织读取现有文件。 可以使用Live Demo选项编译和执行该程序,它将显示文件中存在的所有记录。
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
语法 (Syntax)
以下是文件访问模式随机时读取记录的语法 -
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.
Example - 以下示例使用索引组织读取现有文件。 可以使用大型机上的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.
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动词。
Write语句可以与FROM选项一起使用,直接从工作存储变量中写入记录。 From是一个可选条款。 如果访问模式是顺序的,那么要写入记录,文件必须在输出模式或扩展模式下打开。 如果访问模式是随机或动态的,则要写入记录,文件必须在输出模式或IO模式下打开。
语法 (Syntax)
以下是在文件组织顺序时读取记录的语法 -
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.
Example - 以下示例显示如何在组织顺序时在新文件中插入新记录。
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.
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
重写动词
重写动词用于更新记录。 应在IO模式下打开文件以进行重写操作。 只有在成功读取操作后才能使用它。 重写动词会覆盖最后读取的记录。
语法 (Syntax)
以下是在文件组织顺序时读取记录的语法 -
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.
Example - 以下示例显示如何更新我们在上一个写入步骤中插入的现有记录 -
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.
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
删除动词
删除动词只能在索引文件和相关文件上执行。 必须在IO模式下打开该文件。 在顺序文件组织中,无法删除记录。 在顺序访问模式的情况下,将删除Read语句最后读取的记录。 在随机访问模式下,指定记录键,然后执行删除操作。
语法 (Syntax)
以下是删除记录的语法 -
DELETE file-name RECORD
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Deleted'
END-DELETE.
Example - 删除现有记录 -
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.
JCL执行上述COBOL程序 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR
编译并执行上述程序时,会产生以下结果 -
Record Deleted
开始动词
只能对索引文件和相关文件执行启动动词。 它用于将文件指针放在特定记录上。 访问模式必须是顺序的或动态的。 必须在IO或输入模式下打开文件。
语法 (Syntax)
以下是将指针放在特定记录的语法 -
START file-name KEY IS [=, >, <, NOT, <= or >=] rec-key
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'File Pointer Updated'
END-START.
关闭动词
关闭动词用于关闭文件。 执行关闭操作后,文件结构中的变量将无法进行处理。 程序和文件之间的链接丢失。
语法 (Syntax)
以下是关闭文件的语法 -
CLOSE file-name.