我的顺序文件中有n条记录,我必须使用COBOL程序删除顺序文件中的最后3条记录。我怎么能这样做?
答案 0 :(得分:2)
是的,有一些技巧,但它们都没有通过不同的Cobol编译器和不同的操作系统版本。
如果您想以纯粹的,完全可移植的Cobol风格进行操作,请读取整个文件,一次缓冲三条记录,并在每条记录从缓冲区中删除时写入。当你点击文件末尾时,只需停止写入缓冲的记录,你将删除最后三个。
一些Pseudo-Cobol可能看起来像这样:
Perform Fill-Buffer
Perform until End-Of-File
Perform Write-Buffer
Perform Fill-Buffer
End-Perform
.
Write-Buffer.
Write OUTPUT-FILE
from The-Buffer (TOP-OF-BUFFER)
End-Write
.
Fill-Buffer.
* Do reads to fill a 3 position ring buffer
* and adjust TOP-OF-BUFFER to the current record...
.
实际上,使用实用程序(如SORT)可以做得更好。但你可以用Cobol做到这一点。
答案 1 :(得分:0)
您知道您正在阅读的文件的数量,还是每次运行该程序时都会更改?
在不知道计数的情况下,没有简单的方法可以做到这一点。否则,您必须读取文件两次,一次用于计数,第二次用于存储新的更新记录。
如果空间和内存不是主要问题,请将整个文件放在工作存储中,然后从表中写回文件,减去最后3条记录。这导致文件中有一次没有额外的读取或写入。
答案 2 :(得分:0)
您可以使用dfssort实用程序以非常有效的方式更快地完成此操作,如下所示。这只是一个例子。请相应更改记录长度和其他参数。此外,您需要在此手动计算记录数。
//SORTT001 EXEC PGM=SORT 00100003
//SYSOUT DD SYSOUT=* 00110003
//SORTIN DD DSN=INPUT.FILE,DISP=SHR 00160003
//SORTOUT DD DSN=OUTPUT.FILE, 00170003
// SPACE=(2790,(5376,1075),RLSE), 00180003
// UNIT=SYSSF, 00190003
// DCB=(RECFM=FB,LRECL=0080,BLKSIZE=0), 00200003
// DISP=(NEW,CATLG,DELETE) 00210003
//SYSIN DD * 00220003
SORT FIELDS=COPY,STOPAFT=100 00230003
/*
只计算记录数并更新" STOPAFT = 100"如果你想要一个通用的解决方案,请告诉我。