我編碼程序,如:有沒有辦法在COBOL中參數化函數?
READ-A.
READ FILE-A
AT END
MOVE 1 TO EOF-A
NOT AT END
ADD 1 TO CN-READ-A
END-READ.
F-READ-A. EXIT.
讀取多個文件,我想知道如果有一種方法來編寫一個程序,它能夠從變量讀取的文件名,所以我不必碼每個文件都是一樣的。謝謝!
我編碼程序,如:有沒有辦法在COBOL中參數化函數?
READ-A.
READ FILE-A
AT END
MOVE 1 TO EOF-A
NOT AT END
ADD 1 TO CN-READ-A
END-READ.
F-READ-A. EXIT.
讀取多個文件,我想知道如果有一種方法來編寫一個程序,它能夠從變量讀取的文件名,所以我不必碼每個文件都是一樣的。謝謝!
的一個解決方案如上面所述是使用多個程序或嵌套程序,爲此 我已經包括下面的例子,這是溶液1.
另一個解決方案是COBOL類,這可能不是給你的喜歡但我喜歡它們,所以我包含了一個例子,這就是解決方案2。
解決方案1:
program-id. TestProgram. working-storage section. 01 file-name pic x(128). 01 file-lines pic 9(9). procedure division. move 0 to file-lines move "d:\rts_win32.txt" to file-name call "program1" using file-name file-lines display file-lines stop run end program TestProgram.
program-id. Program1.
file-control.
select file-a assign to myfile
organization is line sequential.
data division.
fd file-a.
01 file-a-line pic x(80).
working-storage section.
01 EOF-A pic 9 value 0.
linkage section.
01 lk-filename pic x(128).
01 CN-READ-A pic 9(9).
procedure division using lk-filename
CN-READ-A.
move lk-filename to myfile
open input file-a
perform READ-A until EOF-A equals 1
close file-a
goback.
READ-A.
READ FILE-A
AT END
MOVE 1 TO EOF-A
NOT AT END
ADD 1 TO CN-READ-A
END-READ.
F-READ-A.
EXIT.
end program Program1.
溶液2
program-id. TestProgram.: working-storage section. 01 file-counter type FileLineCounter.
procedure division.
set file-counter to new type FileLineCounter("d:\rts_win32.txt")
display file-counter::LineCount
stop run
end program TestProgram.
class-id FileLineCounter.
file-control.
select file-a assign to myfile
organization is line sequential.
data division.
fd file-a.
01 file-a-line pic x(80).
working-storage section.
01 cn-read-a binary-long property as "LineCount".
method-id New.
01 EOF-A pic 9 value 0.
procedure division using by value filename as string.
set myfile to filename
open input file-a
perform READ-A until EOF-A equals 1
close file-a
goback.
READ-A.
READ FILE-A
AT END
MOVE 1 TO EOF-A
NOT AT END
ADD 1 TO CN-READ-A
END-READ.
F-READ-A.
EXIT.
end method.
end class.
適當的Cobol參數化例程的方法是通過嵌套子程序。
你可以做你想做的事情,但它依賴於你的編譯器和環境,你可以傳遞一個文件,或者一個文件名或者一個DDname。
你在哪個平臺上?
編輯:在z/OS上,您可以使用putenv()在運行時更改FILE-A指向的內容,以調整與FILE-A使用的DDNAME關聯的數據集名稱。
參見: http://ibmmainframes.com/post-57281.html http://cicswiki.org/cicswiki1/index.php?title=How_do_I_allocate_a_file_dynamically_using_COBOL%3F
您將需要一個OPEN-A和CLOSE-A款以及之間的切換文件。
它並不是完全將參數傳遞給您的讀取語句,但它可以讓您針對不同文件重複使用OPEN/READ/WRITE/CLOSE語句。但只能連續使用。
有辦法,在VS COBOL II,在那裏你可以傳遞一個FD的子程序,會看起來像:
CALL MYREADPGM使用文件-A CALL MYREADPGM使用文件-B
這可能與企業Cobol但IIRC VisualAge不支持。
我正在使用IBM的VisualAge。 – 2011-01-27 18:59:39
您可以創建一個文件名的數據文件,將每個文件視爲一個單獨的記錄,然後讀取每個文件。在「SELECT ... ASSIGN」中,您需要爲文件名使用工作存儲變量,並將「文件名文件」中的值移入其中。
當您使用VisualAge時,我假定在UNIX中,您也可以從shell(sh,ksh)運行程序,並將文件名作爲參數運行,然後從shell中反覆運行程序文件名。
可能不是 「野生」,但與編譯器的支持,但目前ISO 20xx的標準草案包括FUNCTION-ID到位PROGRAM-ID的。它爲COBOL增加了一個參數友好的函數調用計算範例。
今天可能沒有幫助,但也許在不久的將來。如果我沒有弄錯,用戶定義的函數實際上來自COBOL 2002規範,但似乎編譯器供應商在支持該功能時碰到或錯過了。
功能-ID支持在OpenCOBOL 2.0的封閉式試驗中,但2.0版本的時間表未確定,可能在公佈之前還有一年或更長的時間。
很好的解決方法。我會把這個開放幾天,看看有人知道更直接的方法,謝謝! – 2011-01-29 00:57:27