文件處理動詞用于對文件執(zhí)行各種操作。以下是文件處理的動詞:
打開動詞是必須執(zhí)行的第一個文件操作。如果打開成功,則只能對文件進(jìn)行下一步操作。只有打開文件后,文件結(jié)構(gòu)中的變量才可用于處理。每個文件操作后FILE STATUS變量都會更新。
語法
OPEN "mode" file-name.
在這里,文件名是字符串文字,你將用它來命名你的文件。文件可以在以下模式中打開:
模式 | 描述 |
---|---|
Input | 輸入模式用于現(xiàn)有文件。在這種模式下,我們只能讀取文件,不允許有其他操作。 |
Output | 輸出模式用于在文件中插入記錄。如果使用順序文件并且文件保存有一些記錄,則先刪除現(xiàn)有的記錄,然后將新記錄插入文件。在索引文件和相對文件的情況下不會發(fā)生。 |
Extend | 擴(kuò)展模式用于在順序文件中附加記錄。在這種模式下,記錄被插入在文件末尾。如果文件的訪問模式是隨機(jī)或動態(tài),那么擴(kuò)展模式不能使用。 |
I-O | 輸入-輸出模式用于讀取和重寫的文件的記錄。 |
讀取動詞是用于讀取文件記錄。讀取功能是從文件中獲取記錄。在每個讀取動詞中,只有一個記錄可以讀入文件結(jié)構(gòu)。要執(zhí)行讀操作,請在INPUT或I-O模式下打開文件。在每個讀取語句中,文件指針遞增,因此可讀取連續(xù)的記錄。
以下是當(dāng)文件訪問模式是順序時讀取記錄的語法:
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是可選的,在順序讀取索引順序文件時指定。
INTO子句是可選的。ws-file-structure在工作存儲節(jié)中定義,以從READ語句中獲取值。
當(dāng)?shù)竭_(dá)文件末尾時,AT END條件為true。
例:以下示例使用行順序組織讀取現(xiàn)有文件。這個程序可以使用Try it選項進(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í)行上面的程序,會產(chǎn)生以下結(jié)果:
20003 Mohtashim M. 20004 Nishant Malik 20005 Amitabh Bachhan
以下是當(dāng)文件訪問模式為隨機(jī)時讀取記錄的語法:
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)有文件。這個程序可以使用大型機(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í)行上面的程序,會產(chǎn)生以下結(jié)果:
20005 Amitabh Bachhan
寫入動詞用于在文件中插入記錄。一旦記錄被寫入,它就不能再在記錄緩沖區(qū)中使用。在將記錄插入文件之前,移動值到記錄緩沖區(qū)中,然后執(zhí)行寫入動詞。
Write語句可以與FROM選項一起使用,直接從工作存儲變量寫入記錄。From是一個可選子句。如果訪問模式是順序的,則要寫入記錄,文件必須在輸出模式或擴(kuò)展模式下打開。如果訪問模式是隨機(jī)或動態(tài)的,則要寫入記錄,文件必須在輸出模式或I-O模式下打開。
以下是當(dāng)文件組織是順序時,讀取記錄的語法:
WRITE record-buffer [FROM ws-file-structure] END-WRITE.
以下是當(dāng)文件組織是索引或相對時,讀取記錄的語法:
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執(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í)行上面的程序時,將會給輸出文件添加一個新的記錄。
1000 Tim 10
重寫動詞用于更新記錄。文件應(yīng)在I-O模式下打開進(jìn)行重寫操作。只有在成功讀取操作后才能使用它。重寫動詞覆蓋讀取的最后一條記錄。
以下是當(dāng)文件組織是順序時,讀取記錄的語法:
REWRITE record-buffer [FROM ws-file-structure] END-REWRITE.
以下是當(dāng)文件組織是索引或相對時,讀取記錄的語法:
REWRITE record-buffer [FROM ws-file-structure] INVALID KEY DISPLAY 'Invalid Key' NOT INVALID KEY DISPLAY 'Record Updated' END-REWRITE.
例:以下示例顯示如何更新我們在前面的寫入步驟中插入的現(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í)行上面的程序,將會更新記錄:
1000 Tim Dumais 10
刪除動詞只能在索引和相對文件上執(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í)行上面的程序,會產(chǎn)生以下結(jié)果:
Record Deleted
啟動動詞只能在索引和相對文件上執(zhí)行。它用于將文件指針放在特定的記錄上。訪問模式必須是順序或動態(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.
關(guān)閉動詞用于關(guān)閉文件。執(zhí)行關(guān)閉操作后,文件結(jié)構(gòu)中的變量將不可用于處理。程序和文件之間的鏈接丟失。
以下是關(guān)閉文件的語法:
CLOSE file-name.
更多建議: