我编码程序,如:有没有办法在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