2015-02-24 38 views
1

我已经看到了很多的例子在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 

我还没有普遍看到第二种模式,但它似乎更简洁,没有多余的我。与第一个相比,它有问题吗?我并不是指上述主题的变体(它们可以根据你如何定义你所定义的内容而进行不同的分组),但我指的是第一条记录的预读模式的概念,这似乎是在我见过的各种例子中受到青睐。

+1

比尔伍德回答了这个问题。在READ之外的启动读取和PERFORM普遍存在的原因是,它是在NOT AT END被添加到READ语法之前很久才完成的。 – 2015-02-24 19:12:34

+0

@GilbertLeBlanc谢谢,这很有趣(+1)。你碰巧知道什么时候引入了NOT AT END? – lurker 2015-02-24 19:39:11

+0

Cobol 85标准X3.23-1985在互联网上不可用。它可以购买。我的回忆是在1985年标准中的NOT AT END子句被添加到Cobol READ语句中。 – 2015-02-24 20:06:38

回答

3

第一个被称为“启动读取”。使用这意味着总是有一个可用的记录进入处理循环。

第二个被称为...好吧,不知道这是否有一个名称。在处理循环中,必须测试记录的可用性。

一些事情。使用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 
    . 

我强烈赞成启动读取。 “空白”文件可能表明存在问题。现在您可以测试(在读取引导之后),而不必混乱主逻辑。您不必在文件结束时“退出循环”,因为循环只能输入当前记录。

传统上文件将包含“标题”(和“拖车”)。标题将包含日期,逻辑文件名等。标题将被读取和验证,以知道正在处理正确的文件。然后你需要检查有没有两个标题(因为如果你不这样做,有一天会有)。虽然你已经做到了,但你已经有了第一笔数据记录。

你不想在一些“商业”逻辑中做所有事情,或混淆逻辑流程。

在输入记录上的88上,请注意,这是不可跨其他COBOL传输的。例如,在IBM大型机上,除非您的输入是可变长度记录,并且您只使用APPLY WRITE(明确地或由可怕的编译器选项AWO隐式地),然后在文件打开之前在FD下访问数据,关闭后,或在文件结束后会导致崩溃(ABEND)。

+0

谢谢比尔。你回答了我关于'88'EOF状态的问题。我把这个机制扔到了几个地方,作为一种“聪明”的方式来处理这个选项。在这种情况下,我个人会认为便携性比较聪明。因此,使用文件状态可以避免使用“EOF”标志? – lurker 2015-02-24 19:30:15

+1

根本不需要使用AT END/NOT END/END-READ。与INVALID KEY/NOT INVALID KEY相同。没有END-WRITEs。除了示例,我认为我没有编码过它们。在FILE STATUS字段中为88,00为AOK,10为EOF。还有其他的值,它们是标准的,尽管编译器实现者已经知道它们的扩展。 – 2015-02-24 20:11:56

+1

是的,文件状态字段*变成*文件结束标志(以及无效的键控读取/键控写入等)。通过IO代码自动设置,所以您知道错误时它是错误的(除非您打错了88个VALUE)。 – 2015-02-24 20:18:30

0

主要问题是您只拨打PERFORM Process-Record一次,所以在这方面没有第二种模式的改进。

然后你在Cobol工作,但担心模式的企业。我宁愿担心Cobol与较高/较新的语言工作。大约25年前,我用Protos作为一层来隐藏未加工的Cobol。 。 。

+0

你是否暗示第二种方法与第一种方法没有什么功能上的错误? (有关COBOL相关性的意见等讨论不属于我的问题。) – lurker 2015-02-24 16:27:16

+1

“PERFORM Process-Record”只在源代码中出现一次,但每次成功读取时都会执行该操作。不明白你的意思。也许你太多地隐藏了你的COBOL。 – 2015-02-24 16:46:57

+0

如果记录中的“Perform”实际上存在多行代码,那么最好不要重复该代码。只是为了复制'read'命令不会让你的代码变得非常混乱。 – Roland 2015-02-24 17:34:50