用于读取顺序输入文件的模式

时间:2015-02-24 15:40:42

标签: cobol

我已经看到很多在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>模式,这在我见过的各种例子中似乎都很受欢迎。

2 个答案:

答案 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的图层。 。