要在COBOL中使用文件,要在3個不同的部中放上信息。
環(huán)境部,要有程序使用的每個文件的文件控制項目(FILE–CONTROL)。這個項目將程序中使用的文件名與程序外的實際文件聯(lián)系起來。這些項目還定義文件的組織和訪問方式。
數(shù)據(jù)部,要有每個文件的文件描述符(FD)項目,就是數(shù)據(jù)定義。
過程部,放上處理語句,OPEN,READ,WRITE,Delete等。
環(huán)境部中主要是FILE–CONTROL和I–O–CONTROL.I–O–CONTROL很少使用。
Select [OPTIONAL] file–name ASSIGN TO DEV/FILE
[RESERVE N [AREA/AREAS]]
[FILE STATUS IS VAR]
Select必須是第一句,其他順序無關(guān)。file–name是程序中傳遞使用的文件名,相當(dāng)于實際文件的一個別名。OPTIONAL用于執(zhí)行可能不存在的文件。
ASSIGN將file–name連接到實際的外部設(shè)備或文件。(TO好像可以省略。)
RESERVE指定文件緩沖區(qū)。
FILE STATUS指定一個變量存放文件狀態(tài),這個變量應(yīng)該已在WORKING–STORAGE SECTION中定義。
對于順序文件,還有聲明如下:
[ORGANIZATION IS SEQUENTIAL] 可選,缺省為順序組織文件
[ACCESS MODE IS SEQUENTIAL] 可選。順序文件只允許順序訪問
[PADDING CHARACTER IS char] 指定文件在固定塊長設(shè)備上時鍵塊所用的字符,char為一個字符的數(shù)據(jù)項。
[RECORD DELIMITER IS STANDARD/usr–define] 指定如何確定變長紀(jì)錄的長度。
順序文件例子:
Select file–name ASSIGN TO ”/usr/file1″
FILE STATUS IS file–status
對于相對文件,還有聲明如下:
[ORGANIZATION IS RELATIVE] 是相對文件必須的
[ACCESS MODE IS SEQUENTIAL [RELATIVE KEY IS data]] 或者
[ACCESS MODE IS RANDOM/DYNAMIC RELATIVE KEY IS data]
訪問方式有3種,缺省是SEQUENTIAL。
RELATIVE KEY 可選。如果存在,則文件讀取操作順利完成后,data用所讀取紀(jì)錄的關(guān)鍵字更新。data應(yīng)為文件的紀(jì)錄區(qū)中沒有的整數(shù)數(shù)據(jù)項。
相對文件的例子:
Select file–name ASSIGN TO ”/usr/file2″
or GANIZATION IS RELATIVE
ACCESS MODE IS DYNAMIC RELATIVE KEY IS DAY–NUMBER
FILE STATUS IS file–status
對于索引文件,還有聲明如下:
[ORGANIZATION IS INDEXED] 是索引文件必須的
[ACCESS MODE IS SEQUENTIAL/RANDOM/DYNAMIC] RECORD KEY IS data1
[AlterNATE RECORD KEY IS data2 [WITH DUPLICATES]]
訪問方式有3種,缺省是SEQUENTIAL。
RECORD KEY 指定文件的主紀(jì)錄關(guān)鍵字,data1應(yīng)為定義該文件的某個記錄區(qū)的字母數(shù)字數(shù)據(jù)項目。這個關(guān)鍵字的描述及其在數(shù)據(jù)記錄中的位置應(yīng)該與生成文件時所用的關(guān)鍵字一致。
AlterNATE RECORD KEY 如果文件有替換關(guān)鍵字,則其關(guān)鍵字用這個從句的短語指定,索引中允許重復(fù)關(guān)鍵字時采用DUPLICATES.COBOL要求文件記錄中定義data2。重復(fù)關(guān)鍵字的長度及其在數(shù)據(jù)記錄中的位置應(yīng)該與生成文件時一致,所有替換關(guān)鍵字應(yīng)放在文件控制項中。
索引文件的例子:
Select file–name ASSIGN TO ”/usr/file3″
or GANIZATION IS INDEXED
ACCESS MODE IS RANDOM
RECORD KEY IS NUMBER OF EMPLOYEE–RECORD
AlterNATE RECORD KEY IS LAST–NAME OF EMPLOYEE–RECORD WITH DUPLICATES
AlterNATE RECORD KEY IS SS–NUMBER OF EMPLOYEE–RECORD
FILE STATUS IS file–status
這里用戶在程序中使用的文件名是file–name,實際文件名是file3。file–name的定義放在程序后邊的數(shù)據(jù)部的文件節(jié)中。文件是索引文件,程序可以隨機訪問文件。文件的主關(guān)鍵字是NUMBER OF EMPLOYEE–RECORD,替換關(guān)鍵字是LAST–NAME和SS–NUMBER,都是文件記錄區(qū)的字段。LAST–NAME允許重復(fù)。
文件狀態(tài):(對文件操作時返回文件狀態(tài)到定義的文件狀態(tài)變量)
ANY 00 成功
ANY 02 對索引文件,成功但發(fā)現(xiàn)重復(fù)關(guān)鍵字
READ 04 成功,但紀(jì)錄長度不符合指定長度
OPEN 05 成功,但文件是可選的,前面不存在
OPEN,CLOSE 07 對順序文件,成功,但媒介不是盤
READ 10 文件已到末尾
READ 14 對相對文件,相對紀(jì)錄號的有效位超過相對關(guān)鍵字數(shù)據(jù)項允許的位
WRITE,REWRITE 21 對索引文件,順序出錯
WRITE 22 對索引和相對文件,帶這個關(guān)鍵字的紀(jì)錄已經(jīng)存在
START,READ 23 對索引和相對文件,帶這個關(guān)鍵字的紀(jì)錄不存在
WRITE 24 對相對文件,相對紀(jì)錄號的有效位超過相對關(guān)鍵字數(shù)據(jù)項允許的位
ANY 30 I/O錯誤
WRITE 34 對順序文件,發(fā)生超邊界錯誤
OPEN 35 對順序和相對文件,未發(fā)現(xiàn)非可選文件
OPEN 37 對順序和相對文件,該文件不支持指定的打開方式
OPEN 38 對順序和相對文件,文件已經(jīng)用鎖關(guān)閉
OPEN 39 對順序和相對文件,文件屬性不支持程序中指定的屬性
OPEN 41 文件已經(jīng)打開
CLOSE 42 文件未打開
Delete,REWRITE 43 最近的操作不是READ
WRITE,REWRITE 44 紀(jì)錄長度非法
READ 46 沒有有效的下一個記錄
READ,START 47 文件未在INPUT或I–O方式中打開
WRITE 48 文件未在OUTPUT或EXTEND方式中打開
Delete,REWRITE 49 文件未在I–O方式中打開
ANY 90~99 廠家定義
由上可知,文件操作時會發(fā)生錯誤,COBOL提供了檢查錯誤和恢復(fù)I/O錯誤的公用地點。過程部開頭應(yīng)包括DECLARATIVES部分,放上出現(xiàn)錯誤時要執(zhí)行的語句。
PROCEDURE DIVISION.
DECLARATIVES.
section–name SECTION.
USE statement(出現(xiàn)錯誤時調(diào)用的節(jié)).
paragraph–name.
sentence…
END DECLARATIVES.
section–name SECTION.
paragraph–name.
sentence…
USE AFTER STANDARD EXCEPTION/ERROR PROCEDURE ON file–name/INPUT/OUTPUT/I–O/EXTEND
只能在USE語句中指定一個文件,一種方式也只能有一個USE語句。如果既指定了文件,也指定了方式,則文件優(yōu)先。
程序使用的所有文件要定義在數(shù)據(jù)部的第一節(jié)––––文件節(jié)中。
FD file–name
[BLOCK CONTAINS int–1 [TO int–2] RECORDS/CHARACTERS]
[RECORD (CONTAINS int–3 [TO int–4] CHARACTERS)/(IS VARYING IN SIZE [FROM int–5] [TO int–6] CHARACTERS)/(DEPENDING ON data1)
[LABEL (RECORD IS)/(RECORDS ARE) STANDARD/OMITTED]
[VALUE OF (implementor–name IS id–lit–1)...]
[DATA (RECORD IS)/(RECORDS ARE) data2]
BLOCK CONTAINS 指定實際紀(jì)錄的具體長度或最大與最小長度的邏輯記錄數(shù)或塊數(shù)。一般有操作系統(tǒng)和文件系統(tǒng)指定。
RECORD 指定包含變長紀(jì)錄的文件中記錄的最大與最小長度或定長紀(jì)錄的具體長度。
RECORD CONTAINS 如果不帶TO,則int–3是每個紀(jì)錄的長度;如果帶TO,介于int–3和int–4之間。
RECORD IS VARYING 指定紀(jì)錄長度最小int–5和最大int–6。
DEPENDING ON 如要用,則需要在data1中保存紀(jì)錄長度。
LABEL RECORD 指定文件是否帶標(biāo)號。(過時,下個版本不包含)
VALUE 和LABEL一起檢查標(biāo)號的不同部分。(過時,下個版本不包含)
DATA RECORD 指定屬于文件的紀(jì)錄描述項(FD后的01層項目)并作為程序文檔。(過時,下個版本不包含)
一般定義文件只用第一句:FD file–name
順序文件的LINAGE聲明
對順序文件,LINAGE聲明可以在文件輸出是打印機或打印機兼容文件時指定一些打印細節(jié)。
[LINAGE IS BODY LINES [WITH FOOTING AT FOOT][LINES AT TOP TOP][LINES AT BOTTOM BOTTOM]] [CODE–SET IS alphabet–name]
整個文件分成TOP,BODY,BOTTOM三部分。其中BODY包含有FOOT.
CODE–SET指定文件中所用的字符集。
過程部主要是對文件的OPEN,CLOSE,READ,WRITE,START,REWRITE,Delete等操作。
OPEN
OPEN文件有4種方式:(如果文件聲明為OPTIONAL,則文件不存在會創(chuàng)建文件,否則會報錯)
OPEN INPUT FILE–NAME. 只能讀取的文件。
OPEN OUTPUT FILE–NAME. 生成寫入紀(jì)錄的文件,讀取該文件會出錯。若文件已存在,已有記錄會被全部刪除。
OPEN I–O FILE–NAME. 可讀可寫的文件。
OPEN EXTEND FILE–NAME. 生成寫入的文件。與UOTPUT的區(qū)別在于,若文件已存在,EXTEND將紀(jì)錄加在文件末尾。
如果OPEN不成功,執(zhí)行USE語句。USE語句不存在,則程序結(jié)束。
順序文件的OPEN可以有以下方式:
OPEN INPUT FILE–NAME [(WITH NO REWIND)/REVERSED].
OPEN OUTPUT FILE–NAME [WITH NO REWIND].
REVERSED可以逆序處理,即由后向前處理。(過時,下個版本不包含)
WITH NO REWIND 用于單卷磁帶文件,如果指定文件在不適用REWIND的媒介上,忽略。
在文件描述項中指定LINAGE得順序文件不能用EXTEND方式打開。
CLOSE
所有文件的CLOSE方法:
CLOSE FILE–NAME. 關(guān)閉文件。
CLOSE FILE–NAME WITH LOCK. 關(guān)閉文件,不退出程序不能再打開此文件。
順序文件還有其他一些選項,如關(guān)閉卷或單元,和繼續(xù)處理文件:
CLOSE file–name [REEL/UNIT] [FOR REMOVAL]/WITH NO REWIND
READ
順序訪問方式讀文件。一定要有NEXT字樣。
READ file–name [NEXT] RECORD [INTO data1]
[AT END statements][NOT AT END statements] [END–READ]
如果READ成功且有INTO,將讀到的數(shù)據(jù)寫入data1。
如果文件中沒有記錄,執(zhí)行AT ENDstatements,如果沒有就執(zhí)行USE。
如果READ成功,就執(zhí)行NOT AT END statements。
動態(tài)訪問方式讀文件。(相對或索引文件)
利用OPEN語句,將文件指針設(shè)在開頭。
進行各種成功的READ操作。
有START語句標(biāo)識文件中的紀(jì)錄。
隨機訪問方式讀文件。
READ file–name RECORD [INTO data1]
[INVALID KEY statements][NOT INVALID KEY statements] [END–READ]
如果READ成功且有INTO,將讀到的數(shù)據(jù)寫入data1。
如果文件中沒有記錄,執(zhí)行INVALID KEY statements,如果沒有就執(zhí)行USE。
如果READ成功,就執(zhí)行NOT INVALID KEY statements。
如果是相對文件,要設(shè)置文件控制項RELATIVE KEY中指定的整型關(guān)鍵字值后才能執(zhí)行READ.
如果是索引文件,要設(shè)置當(dāng)前索引的關(guān)鍵字值后才能執(zhí)行READ.
WRITE
順序方式。
WRITE data [FROM data1] [BEFORE/AFTER ADVANCING mnemonic–name/PAGE/N LINE(LINES)]
[AT END–OF–PAGE(EOP) statements][NOT AT END–OF–PAGE(EOP) statements][END–WRITE]
如果指定了FROM,先將data1復(fù)制到data,再寫入文件。
BEFORE/AFTER ADVANCING N LINE(LINES) 在紀(jì)錄間插入N個空行。
AT END–OF–PAGE(EOP) 對于帶LINAGE的文件有效,在WRITE使指針進入頁腳(FOOT)時,先執(zhí)行WRITE,再執(zhí)行AT END–OF–PAGE(EOP) statements。
相對和索引文件方式。
WRITE data [FROM data1]
[INVALID KEY statements][NOT INVALID KEY statements] [END–WRITE]
REWRITE
替換文件中的一個記錄。
順序方式:REWRITE data [FROM data1] [END–REWRITE]
相對和索引方式:
REWRITE data [FROM data1]
[INVALID KEY statements][NOT INVALID KEY statements] [END–REWRITE]
Delete
刪除文件中的一個記錄。只能用于相對或索引組織的文件。
Delete file–name RECORD
[INVALID KEY statements][NOT INVALID KEY statements] [END–Delete]
順序訪問方式的話,前一個READ的紀(jì)錄被刪除。
隨機或動態(tài)訪問的話,RELATIVE KEY的內(nèi)容或主關(guān)鍵字所表示的紀(jì)錄從文件中刪除。
START
將相對或索引文件定位到某個紀(jì)錄,以便對其進行順序訪問。只對相對和索引文件有效。
START file–name [KEY IS (EQUAL TO)/=/GREATER THAN/>/NOT LESS THAN/NOT < data]
[INVALID KEY statements][NOT INVALID KEY statements] [END–START]
如果執(zhí)行成功,則data所屬的索引變成文件的當(dāng)前索引。
對于相對文件,data定義為文件的RELATIVE KEY的數(shù)據(jù)項。
對于索引文件,data為下列之一:
文件的主關(guān)鍵字,是RECORD KEY從句中指定的數(shù)據(jù)項。
文件的替換關(guān)鍵字,是AlterNATE RECORD KEY從句指定的數(shù)據(jù)項。
從一個關(guān)鍵字的第一個位置開頭,長度小于或等于該關(guān)鍵字的數(shù)據(jù)項。