Cobol 读取顺序输入文件的模式

Cobol 读取顺序输入文件的模式,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 PERFOR

我已经看到了很多用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

我通常没有看到第二种模式,但对我来说,它似乎更简洁,更少冗余。与第一个相比,它有问题吗?我指的不是上述主题的变体(它们可以根据您定义
执行的内容的方式进行不同的分组),而是指第一条记录预读模式的概念,这似乎在我所看到的各种示例中都得到了支持。

主要问题是,您只调用
performprocessrecord
一次,因此在这方面,第二种模式没有改进

然后,您正在使用Cobol,但担心模式的精细度。我宁愿担心使用Cobol而不是更高/更新的语言。大约25年前,我使用
Protos
作为一个层来隐藏原始Cobol

第一种称为“启动读取”。使用这意味着始终有一条记录进入处理循环

第二个叫做。。。嗯,不确定那有名字。在处理循环中,必须测试记录的可用性

有几件事。使用结尾处的
/非结尾处的/END-READ
本身就有点笨拙(观点)。有一种更干净的方式(它更干净有两个原因)

在文件的SELECT语句中(您应该对所有文件执行此操作),定义一个
文件状态
字段,每个文件一个

每次访问文件后,测试该文件的文件状态字段,并确保访问得到预期结果

使用此方法,当到达文件末尾时,文件状态字段将自动设置为
10
。因此,将88移动到文件状态字段,并将
值更改为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
    .
我非常赞成这项动议。“空”文件可能表示存在问题。现在,您可以测试(在启动读取之后),而不必混乱您的主要逻辑。您不必在文件末尾“跳出循环”,因为循环只在当前记录中输入

传统上,文件将包含“头”(和“尾”)。标头将包含日期、逻辑文件名等。标头将被读取和验证,以了解正在处理的文件是否正确。然后,您需要检查是否有两个标题(因为如果没有,总有一天会有)。当您这样做时,您已经有了第一条数据记录

您不想在一些“业务”逻辑中完成所有这些工作,也不想扰乱逻辑流


在输入记录的第88行,请注意这是不可跨其他COBOL传输的。例如,在IBM大型机上,除非您的输入是可变长度的记录,并且您只使用APPLY WRITE(显式地,或通过可怕的编译器选项AWO隐式地),否则在文件打开之前、关闭之后或文件结束之后访问FD下的数据将导致崩溃(异常终止).

那么,你是在暗示第二种方法与第一种方法在功能上没有什么问题吗?(关于COBOL相关性等观点的讨论不属于我的问题。)
PERFORM Process Record
在源代码中只出现一次,但每次成功读取都会执行一次。不知道你的意思。也许你把COBOL隐藏得太多了。如果记录上的
Perform
实际上存在多行代码,那么最好不要重复这些代码。只要复制
read
命令,代码就不会太混乱。我认为这是一个询问两种不同样式的示例:在循环之前读取一次,在循环结束时读取,而在循环中仅读取一次,如果找到文件结束时避免数据处理。两种风格都可以通过多种方式实现,问题是为什么一种风格占主导地位,而另一种风格似乎更简洁。比尔·伍德格回答了这个问题。启动读取和在读取之外执行的流行原因是,在将NOT AT END添加到读取语法之前很久,它就是这样做的。@GilbertLeBlanc谢谢,知道这个很有意思(+1)。您是否知道
NOT AT END
是何时推出的?Cobol 85标准X3.23-1985在互联网上不可用。可以买到。我记得1985年标准中的Cobol READ语句中添加了NOT AT END子句。@GilbertLeBlanc我可以在'68标准的旧IBM Cobol手册中找到
NOT AT END
。没有文件状态。“我必须检查一下,但我认为文件状态是COBOL'74。”吉尔伯特布兰克现在在1960年给CODASYL的一份关于COBOL的报告中找到了结尾。谢谢比尔。您还回答了我关于
88
EOF状态的未经询问的问题。我把我在几个地方读到的那个机制作为一个“聪明”的方法来处理这个选项。在这种情况下,我个人更倾向于便携性而不是智能性。因此,使用文件状态可以完全避免使用
EOF
标志?根本不需要使用AT-END/NOT-AT-END/END-READ。与无效密钥/非无效密钥相同。也没有结尾。我想除了在示例中,我从来没有编写过它们。文件状态字段中的88s,00为AOK,10为ie EOF。还有其他一些值,它们是标准值,尽管编译器实现人员已经知道会扩展它们。是的,文件状态字段成为文件结束标志(以及无效的键控读/键控写等)。由IO代码自动设置,因此您知道当它出错时,它是错误的(除非您键入88个值)。