要在COBOL中使用文件,要在3個(gè)不同的部中放上信息京办。
環(huán)境部,要有程序使用的每個(gè)文件的文件控制項(xiàng)目(FILE–CONTROL)。這個(gè)項(xiàng)目將程序中使用的文件名與程序外的實(shí)際文件聯(lián)系起來(lái)们何。這些項(xiàng)目還定義文件的組織和訪問(wèn)方式。
數(shù)據(jù)部控轿,要有每個(gè)文件的文件描述符(FD)項(xiàng)目垂蜗,就是數(shù)據(jù)定義。
過(guò)程部解幽,放上處理語(yǔ)句贴见,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必須是第一句片部,其他順序無(wú)關(guān)。file–name是程序中傳遞使用的文件名霜定,相當(dāng)于實(shí)際文件的一個(gè)別名档悠。OPTIONAL用于執(zhí)行可能不存在的文件。
ASSIGN將file–name連接到實(shí)際的外部設(shè)備或文件望浩。(TO好像可以省略辖所。)
RESERVE指定文件緩沖區(qū)。
FILE STATUS指定一個(gè)變量存放文件狀態(tài),這個(gè)變量應(yīng)該已在WORKING–STORAGE SECTION中定義杨蛋。
對(duì)于順序文件,還有聲明如下:
[ORGANIZATION IS SEQUENTIAL] 可選吊宋,缺省為順序組織文件
[ACCESS MODE IS SEQUENTIAL] 可選酥宴。順序文件只允許順序訪問(wèn)
[PADDING CHARACTER IS char] 指定文件在固定塊長(zhǎng)設(shè)備上時(shí)鍵塊所用的字符啦吧,char為一個(gè)字符的數(shù)據(jù)項(xiàng)。
[RECORD DELIMITER IS STANDARD/usr–define] 指定如何確定變長(zhǎng)紀(jì)錄的長(zhǎng)度拙寡。
順序文件例子:
Select file–name ASSIGN TO ”/usr/file1″
FILE STATUS IS file–status
對(duì)于相對(duì)文件授滓,還有聲明如下:
[ORGANIZATION IS RELATIVE] 是相對(duì)文件必須的
[ACCESS MODE IS SEQUENTIAL [RELATIVE KEY IS data]] 或者
[ACCESS MODE IS RANDOM/DYNAMIC RELATIVE KEY IS data]
訪問(wèn)方式有3種,缺省是SEQUENTIAL肆糕。
RELATIVE KEY 可選般堆。如果存在,則文件讀取操作順利完成后诚啃,data用所讀取紀(jì)錄的關(guān)鍵字更新淮摔。data應(yīng)為文件的紀(jì)錄區(qū)中沒(méi)有的整數(shù)數(shù)據(jù)項(xiàng)。
相對(duì)文件的例子:
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
對(duì)于索引文件绍申,還有聲明如下:
[ORGANIZATION IS INDEXED] 是索引文件必須的
[ACCESS MODE IS SEQUENTIAL/RANDOM/DYNAMIC] RECORD KEY IS data1
[AlterNATE RECORD KEY IS data2 [WITH DUPLICATES]]
訪問(wèn)方式有3種噩咪,缺省是SEQUENTIAL。
RECORD KEY 指定文件的主紀(jì)錄關(guān)鍵字极阅,data1應(yīng)為定義該文件的某個(gè)記錄區(qū)的字母數(shù)字?jǐn)?shù)據(jù)項(xiàng)目胃碾。這個(gè)關(guān)鍵字的描述及其在數(shù)據(jù)記錄中的位置應(yīng)該與生成文件時(shí)所用的關(guān)鍵字一致。
AlterNATE RECORD KEY 如果文件有替換關(guān)鍵字筋搏,則其關(guān)鍵字用這個(gè)從句的短語(yǔ)指定仆百,索引中允許重復(fù)關(guān)鍵字時(shí)采用DUPLICATES.COBOL要求文件記錄中定義data2。重復(fù)關(guān)鍵字的長(zhǎng)度及其在數(shù)據(jù)記錄中的位置應(yīng)該與生成文件時(shí)一致奔脐,所有替換關(guān)鍵字應(yīng)放在文件控制項(xià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,實(shí)際文件名是file3髓迎。file–name的定義放在程序后邊的數(shù)據(jù)部的文件節(jié)中峦朗。文件是索引文件,程序可以隨機(jī)訪問(wèn)文件排龄。文件的主關(guān)鍵字是NUMBER OF EMPLOYEE–RECORD波势,替換關(guān)鍵字是LAST–NAME和SS–NUMBER,都是文件記錄區(qū)的字段橄维。LAST–NAME允許重復(fù)尺铣。
文件狀態(tài):(對(duì)文件操作時(shí)返回文件狀態(tài)到定義的文件狀態(tài)變量)
ANY 00 成功
ANY 02 對(duì)索引文件,成功但發(fā)現(xiàn)重復(fù)關(guān)鍵字
READ 04 成功争舞,但紀(jì)錄長(zhǎng)度不符合指定長(zhǎng)度
OPEN 05 成功凛忿,但文件是可選的,前面不存在
OPEN,CLOSE 07 對(duì)順序文件竞川,成功店溢,但媒介不是盤
READ 10 文件已到末尾
READ 14 對(duì)相對(duì)文件叁熔,相對(duì)紀(jì)錄號(hào)的有效位超過(guò)相對(duì)關(guān)鍵字?jǐn)?shù)據(jù)項(xiàng)允許的位
WRITE,REWRITE 21 對(duì)索引文件,順序出錯(cuò)
WRITE 22 對(duì)索引和相對(duì)文件逞怨,帶這個(gè)關(guān)鍵字的紀(jì)錄已經(jīng)存在
START,READ 23 對(duì)索引和相對(duì)文件者疤,帶這個(gè)關(guān)鍵字的紀(jì)錄不存在
WRITE 24 對(duì)相對(duì)文件福澡,相對(duì)紀(jì)錄號(hào)的有效位超過(guò)相對(duì)關(guān)鍵字?jǐn)?shù)據(jù)項(xiàng)允許的位
ANY 30 I/O錯(cuò)誤
WRITE 34 對(duì)順序文件叠赦,發(fā)生超邊界錯(cuò)誤
OPEN 35 對(duì)順序和相對(duì)文件,未發(fā)現(xiàn)非可選文件
OPEN 37 對(duì)順序和相對(duì)文件革砸,該文件不支持指定的打開(kāi)方式
OPEN 38 對(duì)順序和相對(duì)文件除秀,文件已經(jīng)用鎖關(guān)閉
OPEN 39 對(duì)順序和相對(duì)文件,文件屬性不支持程序中指定的屬性
OPEN 41 文件已經(jīng)打開(kāi)
CLOSE 42 文件未打開(kāi)
Delete,REWRITE 43 最近的操作不是READ
WRITE,REWRITE 44 紀(jì)錄長(zhǎng)度非法
READ 46 沒(méi)有有效的下一個(gè)記錄
READ,START 47 文件未在INPUT或I–O方式中打開(kāi)
WRITE 48 文件未在OUTPUT或EXTEND方式中打開(kāi)
Delete,REWRITE 49 文件未在I–O方式中打開(kāi)
ANY 90~99 廠家定義
由上可知算利,文件操作時(shí)會(huì)發(fā)生錯(cuò)誤册踩,COBOL提供了檢查錯(cuò)誤和恢復(fù)I/O錯(cuò)誤的公用地點(diǎn)。過(guò)程部開(kāi)頭應(yīng)包括DECLARATIVES部分效拭,放上出現(xiàn)錯(cuò)誤時(shí)要執(zhí)行的語(yǔ)句暂吉。
PROCEDURE DIVISION.
DECLARATIVES.
section–name SECTION.
USE statement(出現(xiàn)錯(cuò)誤時(shí)調(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語(yǔ)句中指定一個(gè)文件,一種方式也只能有一個(gè)USE語(yǔ)句缎患。如果既指定了文件慕的,也指定了方式,則文件優(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 指定實(shí)際紀(jì)錄的具體長(zhǎng)度或最大與最小長(zhǎng)度的邏輯記錄數(shù)或塊數(shù)。一般有操作系統(tǒng)和文件系統(tǒng)指定判导。
RECORD 指定包含變長(zhǎng)紀(jì)錄的文件中記錄的最大與最小長(zhǎng)度或定長(zhǎng)紀(jì)錄的具體長(zhǎng)度嫉父。
RECORD CONTAINS 如果不帶TO,則int–3是每個(gè)紀(jì)錄的長(zhǎng)度眼刃;如果帶TO,介于int–3和int–4之間绕辖。
RECORD IS VARYING 指定紀(jì)錄長(zhǎng)度最小int–5和最大int–6。
DEPENDING ON 如要用擂红,則需要在data1中保存紀(jì)錄長(zhǎng)度仪际。
LABEL RECORD 指定文件是否帶標(biāo)號(hào)。(過(guò)時(shí)篮条,下個(gè)版本不包含)
VALUE 和LABEL一起檢查標(biāo)號(hào)的不同部分弟头。(過(guò)時(shí),下個(gè)版本不包含)
DATA RECORD 指定屬于文件的紀(jì)錄描述項(xiàng)(FD后的01層項(xiàng)目)并作為程序文檔涉茧。(過(guò)時(shí)赴恨,下個(gè)版本不包含)
一般定義文件只用第一句:FD file–name
順序文件的LINAGE聲明
對(duì)順序文件,LINAGE聲明可以在文件輸出是打印機(jī)或打印機(jī)兼容文件時(shí)指定一些打印細(xì)節(jié)伴栓。
[LINAGE IS BODY LINES [WITH FOOTING AT FOOT][LINES AT TOP TOP][LINES AT BOTTOM BOTTOM]] [CODE–SET IS alphabet–name]
整個(gè)文件分成TOP,BODY,BOTTOM三部分伦连。其中BODY包含有FOOT.
CODE–SET指定文件中所用的字符集雨饺。
過(guò)程部主要是對(duì)文件的OPEN,CLOSE,READ,WRITE,START,REWRITE,Delete等操作。
OPEN
OPEN文件有4種方式:(如果文件聲明為OPTIONAL惑淳,則文件不存在會(huì)創(chuàng)建文件额港,否則會(huì)報(bào)錯(cuò))
OPEN INPUT FILE–NAME. 只能讀取的文件。
OPEN OUTPUT FILE–NAME. 生成寫入紀(jì)錄的文件歧焦,讀取該文件會(huì)出錯(cuò)移斩。若文件已存在,已有記錄會(huì)被全部刪除绢馍。
OPEN I–O FILE–NAME. 可讀可寫的文件向瓷。
OPEN EXTEND FILE–NAME. 生成寫入的文件。與UOTPUT的區(qū)別在于舰涌,若文件已存在猖任,EXTEND將紀(jì)錄加在文件末尾。
如果OPEN不成功瓷耙,執(zhí)行USE語(yǔ)句朱躺。USE語(yǔ)句不存在,則程序結(jié)束搁痛。
順序文件的OPEN可以有以下方式:
OPEN INPUT FILE–NAME [(WITH NO REWIND)/REVERSED].
OPEN OUTPUT FILE–NAME [WITH NO REWIND].
REVERSED可以逆序處理长搀,即由后向前處理。(過(guò)時(shí)落追,下個(gè)版本不包含)
WITH NO REWIND 用于單卷磁帶文件盈滴,如果指定文件在不適用REWIND的媒介上,忽略轿钠。
在文件描述項(xiàng)中指定LINAGE得順序文件不能用EXTEND方式打開(kāi)巢钓。
CLOSE
所有文件的CLOSE方法:
CLOSE FILE–NAME. 關(guān)閉文件。
CLOSE FILE–NAME WITH LOCK. 關(guān)閉文件疗垛,不退出程序不能再打開(kāi)此文件症汹。
順序文件還有其他一些選項(xiàng),如關(guān)閉卷或單元,和繼續(xù)處理文件:
CLOSE file–name [REEL/UNIT] [FOR REMOVAL]/WITH NO REWIND
READ
順序訪問(wèn)方式讀文件贷腕。一定要有NEXT字樣背镇。
READ file–name [NEXT] RECORD [INTO data1]
[AT END statements][NOT AT END statements] [END–READ]
如果READ成功且有INTO,將讀到的數(shù)據(jù)寫入data1泽裳。
如果文件中沒(méi)有記錄瞒斩,執(zhí)行AT ENDstatements,如果沒(méi)有就執(zhí)行USE涮总。
如果READ成功胸囱,就執(zhí)行NOT AT END statements。
動(dòng)態(tài)訪問(wèn)方式讀文件瀑梗。(相對(duì)或索引文件)
利用OPEN語(yǔ)句烹笔,將文件指針設(shè)在開(kāi)頭裳扯。
進(jìn)行各種成功的READ操作。
有START語(yǔ)句標(biāo)識(shí)文件中的紀(jì)錄谤职。
隨機(jī)訪問(wèn)方式讀文件饰豺。
READ file–name RECORD [INTO data1]
[INVALID KEY statements][NOT INVALID KEY statements] [END–READ]
如果READ成功且有INTO,將讀到的數(shù)據(jù)寫入data1允蜈。
如果文件中沒(méi)有記錄冤吨,執(zhí)行INVALID KEY statements,如果沒(méi)有就執(zhí)行USE陷寝。
如果READ成功锅很,就執(zhí)行NOT INVALID KEY statements其馏。
如果是相對(duì)文件凤跑,要設(shè)置文件控制項(xiàng)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個(gè)空行咖耘。
AT END–OF–PAGE(EOP) 對(duì)于帶LINAGE的文件有效,在WRITE使指針進(jìn)入頁(yè)腳(FOOT)時(shí)撬码,先執(zhí)行WRITE儿倒,再執(zhí)行AT END–OF–PAGE(EOP) statements。
相對(duì)和索引文件方式呜笑。
WRITE data [FROM data1]
[INVALID KEY statements][NOT INVALID KEY statements] [END–WRITE]
REWRITE
替換文件中的一個(gè)記錄夫否。
順序方式:REWRITE data [FROM data1] [END–REWRITE]
相對(duì)和索引方式:
REWRITE data [FROM data1]
[INVALID KEY statements][NOT INVALID KEY statements] [END–REWRITE]
Delete
刪除文件中的一個(gè)記錄。只能用于相對(duì)或索引組織的文件叫胁。
Delete file–name RECORD
[INVALID KEY statements][NOT INVALID KEY statements] [END–Delete]
順序訪問(wèn)方式的話凰慈,前一個(gè)READ的紀(jì)錄被刪除。
隨機(jī)或動(dòng)態(tài)訪問(wèn)的話驼鹅,RELATIVE KEY的內(nèi)容或主關(guān)鍵字所表示的紀(jì)錄從文件中刪除微谓。
START
將相對(duì)或索引文件定位到某個(gè)紀(jì)錄,以便對(duì)其進(jìn)行順序訪問(wèn)输钩。只對(duì)相對(duì)和索引文件有效豺型。
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)前索引买乃。
對(duì)于相對(duì)文件姻氨,data定義為文件的RELATIVE KEY的數(shù)據(jù)項(xiàng)。
對(duì)于索引文件为牍,data為下列之一:
文件的主關(guān)鍵字哼绑,是RECORD KEY從句中指定的數(shù)據(jù)項(xiàng)岩馍。
文件的替換關(guān)鍵字,是AlterNATE RECORD KEY從句指定的數(shù)據(jù)項(xiàng)抖韩。
從一個(gè)關(guān)鍵字的第一個(gè)位置開(kāi)頭蛀恩,長(zhǎng)度小于或等于該關(guān)鍵字的數(shù)據(jù)項(xiàng)。