我正在编写例如:
的例程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.
读取几个文件,我想知道是否有办法编写一个能够从变量中读取文件名的例程,所以我不必为每个文件编写相同的代码。谢谢!
答案 0 :(得分:2)
如上所述的一种解决方案是使用多个程序或嵌套程序 我在下面列举了一个例子,即解决方案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.
答案 1 :(得分:1)
参数化例程的正确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段落。
并不是将参数传递给read语句,但它允许您为不同的文件重用OPEN / READ / WRITE / CLOSE语句。但只是连续的。
在VS COBOL II下,有一种方法可以将FD传递给子程序,这看起来像是:
使用文件A调用MYREADPGM 使用FILE-B打电话给MYREADPGM
这可能与Enterprise Cobol有关,但IIRC VisualAge不支持。
答案 2 :(得分:0)
在编译器支持下可能不是“野外”,但当前的ISO Draft 20xx标准包含 FUNCTION-ID 代替PROGRAM-ID。它为COBOL添加了一个参数友好函数调用计算范例。
今天可能没有帮助,但可能在不久的将来。如果我没有弄错的话,用户定义的函数实际上来自COBOL 2002规范,但似乎编译器供应商对该功能的支持有所不同。
FUNCTION-ID支持是针对OpenCOBOL 2.0的封闭式试验,但2.0发布的时间表尚未确定,可能需要一年或更长时间才能公布。
答案 3 :(得分:-1)
您可以创建文件名的数据文件,将每个文件名视为单个记录,然后读取每个文件。在“SELECT ... ASSIGN”中,您需要为文件名使用工作存储变量,并将值从“文件名文件”移动到其中。
当您使用VisualAge时,我假设在UNIX中,您也可以从shell(sh,ksh)运行程序,文件名作为参数,并从shell为每个文件重复运行程序名。