我已经看到很多在COBOL中读取顺序文件的例子看起来像这样:
FD File-Record
01 Input-Record.
88 End-Of-File VALUE HIGH-VALUES.
05 ...
...
READ File-Record
AT END SET End-Of-File TO TRUE
END-READ
PERFORM UNTIL End-Of-File
PERFORM Process-Record
READ File-Record
AT END SET End-Of-File TO TRUE
END-READ
END-PERFORM
有一个问题是,按照以下方式处理它也是一样吗?
PERFORM UNTIL End-Of-File
READ File-Record
AT END SET End-Of-File TO TRUE
NOT AT END PERFORM Process-Record
END-READ
END-PERFORM
我一般没有看到第二种模式,但它看起来更简洁,更少冗余。它与第一个相比有问题吗?我不是指上述主题的变体(它们可以根据您如何定义PERFORM
的方式进行不同的分组),但我指的是第一条记录预读的概念< / em>模式,这在我见过的各种例子中似乎都很受欢迎。
答案 0 :(得分:3)
第一种称为&#34;启动读取&#34;。使用这意味着总有一条记录可用于处理循环。
第二个被称为......好吧,不确定是否有名字。在处理循环中,必须测试记录的可用性。
有几件事。使用AT END/NOT AT END/END-READ
本身有点笨拙(意见)。有一种更清洁的方式(它更清洁的两个原因)。
在您的文件的SELECT语句上(您应对所有文件执行此操作)定义FILE STATUS
字段,每个文件单独。
在每次文件访问后,测试该文件的文件状态字段,并确保访问权限给出了预期的结果。
使用此方法,当到达文件结尾时,文件状态字段将自动设置为10
。因此,您将88移动到文件状态字段,并将VALUE
更改为10.
01 INPUT-FILE-STATUS PIC XX.
88 INPUT-FILE-OK VALUE ZERO "10".
88 INPUT-FILE-EOF VALUE "10".
PERFORM PRIMING-READ
PERFORM UNTIL End-Of-File
PERFORM Process-Record
PERFORM READ-A-RECORD05 is optional file not present, 23 is record not found.
END-PERFORM
...
PRIMING-READ.
PERFORM READ-A-RECORD
IF INPUT-FILE-EOF
[cancel with end-of-file on first read message]
END-IF
.
READ-A-RECORD.
READ File-Record
IF NOT INPUT-FILE-OK
[code here to check file-status field and crash if bad]
END-IF
.
我非常赞成启动阅读。一个&#34;空&#34;文件可能表示存在问题。现在你可以测试(在启动读取之后)而不必混乱你的主逻辑。你没有必要离开这个循环&#34;在文件结束时,因为循环只输入当前记录。
传统上文件包含&#34;标题&#34; (和#34;预告片&#34;)。标题将包含日期,逻辑文件名等。将读取并验证标题以知道正在处理正确的文件。然后你需要检查是否有两个标题(因为如果你没有,那么有一天会有)。虽然您已经完成了这项工作,但您已经拥有了第一份数据记录。
你不想在某些&#34; business&#34;中做所有这些。逻辑或混乱逻辑的流程。
在输入记录的88上,请注意这在其他COBOL上是不可传输的。例如,在IBM大型机上,除非您的输入是可变长度记录,并且您只使用APPLY WRITE(由可怕的编译器选项AWO显式或隐式),然后在文件打开之前访问FD下的数据,在关闭之后,或文件结束后将导致崩溃(ABEND)。
答案 1 :(得分:0)
主要问题是你只调用PERFORM Process-Record
一次,所以在这方面第二种模式没有改善。
然后你在Cobol工作,但担心模式的问题。我宁愿担心在Cobol工作而不是更高/更新的语言。大约25年前,我使用Protos
作为隐藏原始Cobol的图层。 。