COBOL - 文件处理动词

文件处理动词用于对文件执行各种操作。 以下是文件处理动词 −

  • Open
  • Read
  • Write
  • Rewrite
  • Delete
  • Start
  • Close

Open 动词

Open 是必须执行的第一个文件操作。 如果"打开"成功,则只能对文件进行进一步的操作。 只有打开文件后,文件结构中的变量才可用于处理。 文件状态变量在每次文件操作后更新。

语法

OPEN "mode" file-name.

这里,文件名是字符串文字,您将用它来命名您的文件。 文件可以通过以下模式打开−

序号 模式 & 描述
1

Input

输入模式用于现有文件。 在这种模式下,我们只能读取文件,不允许对文件进行其他操作。

2

Output

输出模式用于在文件中插入记录。 如果使用顺序文件并且该文件保存了一些记录,则将首先删除现有记录,然后将新记录插入到文件中。 如果是索引文件相对文件,则不会发生这种情况。

3

Extend

扩展模式用于在顺序文件中追加记录。 在此模式下,记录被插入到末尾。 如果文件访问模式为随机动态,则无法使用扩展模式。

4

I-O

输入输出模式用于读取和重写文件的记录。

Read 动词

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

语法

以下是文件访问模式为顺序时读取记录的语法 −

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-struct在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 动词

Write 动词用于在文件中插入记录。 一旦记录被写入,它就不再在记录缓冲区中可用。 在将记录插入文件之前,将值移动到记录缓冲区中,然后执行 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 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 动词

Rewrite 动词用于更新记录。 文件应以 I-O 模式打开以进行重写操作。 只有读操作成功后才能使用。 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.

示例 − 以下示例显示如何更新我们在上一个写入步骤中插入的现有记录 −

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 动词

Delete 动词只能对索引文件和相关文件执行。 文件必须以 I-O 模式打开。 在顺序文件组织中,无法删除记录。 如果是顺序访问模式,则删除 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 动词

Start 动词只能对索引文件和相关文件执行。 它用于将文件指针放置在特定记录处。 访问模式必须是顺序的或动态的。 文件必须以 I-O 或输入模式打开。

语法

以下是将指针放置在特定记录处的语法 −

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 file-name.