COBOL - 文件处理动词

  • 简述

    文件处理动词用于对文件执行各种操作。以下是文件处理动词 -
    • Open
    • Read
    • Write
    • Rewrite
    • Delete
    • Start
    • Close
  • Open 动词

    Open 是必须执行的第一个文件操作。如果 Open 成功,则只能对文件进行进一步的操作。只有在Open 文件后,文件结构中的变量才可供处理。FILE STATUS每次文件操作后都会更新变量。

    句法

    
    OPEN "mode" file-name.
    
    在这里,文件名是字符串文字,您将使用它来命名您的文件。可以在以下模式下Open 文件 -
    序号 模式与说明
    1
    Input
    输入模式用于现有文件。在这种模式下,我们只能读取文件,不允许对文件进行其他操作。
    2
    Output
    输出模式用于在文件中插入记录。如果一个sequential file被使用并且文件保存了一些记录,那么将首先删除现有记录,然后将新记录插入文件中。它不会发生这样的情况indexed file或一个relative file.
    3
    Extend
    扩展模式用于将记录追加到sequential file. 在这种模式下,记录插入到最后。如果文件访问模式是Random或者Dynamic,则无法使用扩展模式。
    4
    I-O
    Input-Output 模式用于读取和重写文件的记录。
  • Read 动词

    Read 动词用于读取文件记录。read 的功能是从文件中获取记录。在每个读取动词处,只能将一条记录读入文件结构。要执行读取操作,请在 INPUT 或 IO 模式下Open 文件。在每个读取语句中,文件指针都会递增,因此会读取连续的记录。

    句法

    以下是文件访问模式为顺序时读取记录的语法 -
    
    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。
    例如− 以下示例使用行顺序组织读取现有文件。该程序可以使用编译和执行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 
    

    句法

    以下是文件访问模式为随机时写入记录的语法 -
    
    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.
    
    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 动词

    写动词用于在文件中插入记录。一旦记录被写入,它就不再在记录缓冲区中可用。在将记录插入文件之前,将值移动到记录缓冲区,然后执行写入动作。
    写语句可以与FROM直接从工作存储变量写入记录的选项。From 是一个可选子句。如果访问模式是顺序的,那么要写入记录,文件必须以输出模式或扩展模式Open 。如果访问模式是随机或动态的,那么要写入一条记录,文件必须以输出模式或 IO 模式Open 。

    句法

    以下是当文件组织是顺序时读取记录的语法 -
    
    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.
    
    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 动词

    重写动词用于更新记录。文件应以 IO 模式Open 以进行重写操作。只有在读取操作成功后才能使用它。重写动词覆盖最后读取的记录。

    句法

    以下是当文件组织是顺序时读取记录的语法 -
    
    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 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
    
  • Delete 动词

    删除动词只能在索引文件和相关文件上执行。该文件必须以 IO 模式Open 。在顺序文件组织中,不能删除记录。在顺序访问模式下,Read 语句最后读取的记录被删除。在随机访问模式下,指定记录键,然后执行删除操作。

    句法

    以下是删除记录的语法 -
    
    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.
    
    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 动词

    开始动词只能在索引文件和相关文件上执行。它用于将文件指针放在特定记录处。访问模式必须是顺序的或动态的。文件必须以 IO 或输入模式Open 。

    句法

    以下是将指针放在特定记录的语法 -
    
    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 file-name.