COBOL 文件處理動(dòng)詞

2018-10-18 15:27 更新

文件處理動(dòng)詞用于對(duì)文件執(zhí)行各種操作。以下是文件處理的動(dòng)詞:

  • Open(打開)
  • Read(讀取)
  • Write(寫入)
  • Rewrite(重寫)
  • Delete(刪除)
  • Start(啟動(dòng))
  • Close(關(guān)閉)

Open(打開)動(dòng)詞

打開動(dòng)詞是必須執(zhí)行的第一個(gè)文件操作。如果打開成功,則只能對(duì)文件進(jìn)行下一步操作。只有打開文件后,文件結(jié)構(gòu)中的變量才可用于處理。每個(gè)文件操作后FILE STATUS變量都會(huì)更新。

語法

OPEN "mode" file-name.

在這里,文件名是字符串文字,你將用它來命名你的文件。文件可以在以下模式中打開:

模式描述
Input輸入模式用于現(xiàn)有文件。在這種模式下,我們只能讀取文件,不允許有其他操作。
Output輸出模式用于在文件中插入記錄。如果使用順序文件并且文件保存有一些記錄,則先刪除現(xiàn)有的記錄,然后將新記錄插入文件。在索引文件相對(duì)文件的情況下不會(huì)發(fā)生。
Extend擴(kuò)展模式用于在順序文件中附加記錄。在這種模式下,記錄被插入在文件末尾。如果文件的訪問模式是隨機(jī)動(dòng)態(tài),那么擴(kuò)展模式不能使用。
I-O輸入-輸出模式用于讀取和重寫的文件的記錄。

Read(讀?。?/span>動(dòng)詞

讀取動(dòng)詞是用于讀取文件記錄。讀取功能是從文件中獲取記錄。在每個(gè)讀取動(dòng)詞中,只有一個(gè)記錄可以讀入文件結(jié)構(gòu)。要執(zhí)行讀操作,請(qǐng)?jiān)贗NPUT或I-O模式下打開文件。在每個(gè)讀取語句中,文件指針遞增,因此可讀取連續(xù)的記錄。

語法

以下是當(dāng)文件訪問模式是順序時(shí)讀取記錄的語法:

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.

下面是所使用的參數(shù):

  • NEXT RECORD是可選的,在順序讀取索引順序文件時(shí)指定。

  • INTO子句是可選的。ws-file-structure在工作存儲(chǔ)節(jié)中定義,以從READ語句中獲取值。

  • 當(dāng)?shù)竭_(dá)文件末尾時(shí),AT END條件為true。

:以下示例使用行順序組織讀取現(xiàn)有文件。這個(gè)程序可以使用Try it選項(xiàng)進(jìn)行編譯和執(zhí)行,它將顯示文件中存在的所有記錄。

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.

假設(shè)input.txt文件中可用的輸入文件數(shù)據(jù)包含以下內(nèi)容:

20003 Mohtashim M.
20004 Nishant Malik
20005 Amitabh Bachhan

當(dāng)你編譯和執(zhí)行上面的程序,會(huì)產(chǎn)生以下結(jié)果:

20003 Mohtashim M.            
20004 Nishant Malik           
20005 Amitabh Bachhan 

語法

以下是當(dāng)文件訪問模式為隨機(jī)時(shí)讀取記錄的語法:

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.

例:以下示例使用索引組織讀取現(xiàn)有文件。這個(gè)程序可以使用大型機(jī)上的JCL進(jìn)行編譯和執(zhí)行,它將顯示文件中存在的所有記錄。在大型機(jī)服務(wù)器上,我們不使用文本文件,而是使用PS文件。

我們假設(shè)存在于大型機(jī)上的文件與上述示例中的input.txt文件具有相同的內(nèi)容。

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執(zhí)行上述COBOL程序:

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
//IN1 DD DSN=STUDENT-FILE-NAME,DISP=SHR

當(dāng)你編譯和執(zhí)行上面的程序,會(huì)產(chǎn)生以下結(jié)果:

20005 Amitabh Bachhan 

Write(寫入)動(dòng)詞

寫入動(dòng)詞用于在文件中插入記錄。一旦記錄被寫入,它就不能再在記錄緩沖區(qū)中使用。在將記錄插入文件之前,移動(dòng)值到記錄緩沖區(qū)中,然后執(zhí)行寫入動(dòng)詞。

Write語句可以與FROM選項(xiàng)一起使用,直接從工作存儲(chǔ)變量寫入記錄。From是一個(gè)可選子句。如果訪問模式是順序的,則要寫入記錄,文件必須在輸出模式或擴(kuò)展模式下打開。如果訪問模式是隨機(jī)或動(dòng)態(tài)的,則要寫入記錄,文件必須在輸出模式或I-O模式下打開。

語法

以下是當(dāng)文件組織是順序時(shí),讀取記錄的語法:

WRITE record-buffer [FROM ws-file-structure]
END-WRITE.

以下是當(dāng)文件組織是索引或相對(duì)時(shí),讀取記錄的語法:

WRITE record-buffer [FROM ws-file-structure]
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Inserted'
END-WRITE.

例:以下示例顯示了在文件組織為順序時(shí),如何在一個(gè)新文件中插入新的記錄。

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執(zhí)行上述COBOL程序:

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
//OUT1 DD DSN=OUTPUT-FILE-NAME,DISP=(NEW,CATALOG,DELETE)

當(dāng)你編譯并執(zhí)行上面的程序時(shí),將會(huì)給輸出文件添加一個(gè)新的記錄。

1000 Tim         10

Rewrite(重寫)動(dòng)詞

重寫動(dòng)詞用于更新記錄。文件應(yīng)在I-O模式下打開進(jìn)行重寫操作。只有在成功讀取操作后才能使用它。重寫動(dòng)詞覆蓋讀取的最后一條記錄。

語法

以下是當(dāng)文件組織是順序時(shí),讀取記錄的語法:

REWRITE record-buffer [FROM ws-file-structure]
END-REWRITE.

以下是當(dāng)文件組織是索引或相對(duì)時(shí),讀取記錄的語法:

REWRITE record-buffer [FROM ws-file-structure]
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Updated'
END-REWRITE.

例:以下示例顯示如何更新我們?cè)谇懊娴膶懭氩襟E中插入的現(xiàn)有記錄:

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執(zhí)行上述COBOL程序:

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
//IN1 DD DSN=OUTPUT-FILE-NAME,DISP=SHR

當(dāng)你編譯并執(zhí)行上面的程序,將會(huì)更新記錄:

1000 Tim Dumais  10

Delete(刪除)動(dòng)詞

刪除動(dòng)詞只能在索引和相對(duì)文件上執(zhí)行。文件必須在I-O模式下打開。在順序文件組織中,記錄不能被刪除。Read語句讀取的最后一條記錄在順序訪問模式的情況下可被刪除。在隨機(jī)訪問模式下,指定記錄鍵,然后執(zhí)行刪除操作。

語法

以下是刪除記錄的語法:

DELETE file-name RECORD
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Deleted'
END-DELETE.

例:刪除現(xiàn)有的記錄:

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執(zhí)行上述COBOL程序:

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
//OUT1 DD DSN=OUTPUT-FILE-NAME,DISP=SHR

當(dāng)你編譯和執(zhí)行上面的程序,會(huì)產(chǎn)生以下結(jié)果:

Record Deleted

Start(啟動(dòng))動(dòng)詞

啟動(dòng)動(dòng)詞只能在索引和相對(duì)文件上執(zhí)行。它用于將文件指針放在特定的記錄上。訪問模式必須是順序或動(dòng)態(tài)的。文件必須在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(關(guān)閉)動(dòng)詞

關(guān)閉動(dòng)詞用于關(guān)閉文件。執(zhí)行關(guān)閉操作后,文件結(jié)構(gòu)中的變量將不可用于處理。程序和文件之間的鏈接丟失。

語法

以下是關(guān)閉文件的語法:

CLOSE file-name.
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)