我见过很多在 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
进行不同的分组),而是指第一条记录预执行的概念。 -read 模式,在我见过的各种示例中似乎更受青睐。
最佳答案
第一个称为“启动阅读”。使用此方法意味着始终有可用的记录进入处理循环。
第二个叫做...好吧,不确定它有名字。在处理循环中,必须测试记录的可用性。
有几件事。使用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
.
我强烈赞成启动阅读。 “空”文件可能表明存在问题。现在您可以进行测试(在启动阅读之后),而不必扰乱您的主要逻辑。您不必在文件末尾“退出循环”,因为循环仅与当前记录一起进入。
传统上,文件将包含“标题”(和“预告片”)。 header 将包含日期、逻辑文件名等。 header 将被读取并验证以了解正在处理正确的文件。然后您需要检查是否没有两个 header (因为如果不这样做,有一天就会有)。当您完成此操作时,您已经有了第一个数据记录。
您不想在某些“业务”逻辑中执行所有这些操作或扰乱逻辑流程。
在输入记录的 88 上,请注意,这是不可跨其他 COBOL 传输的。例如,在 IBM 大型机上,除非您的输入是可变长度记录并且您使用 APPLY WRITE ONLY (显式地或通过可怕的编译器选项 AWO 隐式地使用),然后在文件打开之前或关闭之后访问 FD 下的数据,或者在文件结束之后将导致崩溃(ABEND)。
关于cobol - 读取顺序输入文件的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28700006/