cobol - 读取顺序输入文件的模式

标签 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进行不同的分组),而是指第一条记录预执行的概念。 -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/

相关文章:

java - JZOS 批处理工具包 - 集成 JZOS Cobol 记录生成器

cobol - COBOL 的 ATAN 学位?

security - 如何在COBOL中存储敏感信息?

visual-studio-2013 - COBOL 非法文件名

ruby-on-rails - 是否存在将数字转换为 comp-3/压缩十进制格式的现有 gem 或脚本?

environment-variables - COBOL 从环境中接受返回 "Invalid parameter error"

programming-languages - 您会将 COBOL 程序移植到哪种语言,为什么?

cobol - COBOL 中的小数

cobol - 可变 block 格式和固定 block 格式有什么区别?

recursion - 在 COBOL 中,是否可以递归调用一个段落?