如果在2个平面文件中找不到匹配项,如何防止Cobol程序进入无限循环?

时间:2011-03-31 12:33:37

标签: cobol cobol85 gnucobol

Cobol程序从第一个平面文件中读取记录,并将其与第二个平面文件中的第一个记录进行比较。但是,因为第一个平面文件中的第一个记录与第二个平面文件中的任何记录都不匹配,所以Cobol程序进入无限循环。我该如何解决?

3 个答案:

答案 0 :(得分:1)

在文件结尾处,最后一条记录保留在记录区域中。因此,如果您没有检查文件结束情况,您的程序将不会自行停止运行。

答案 1 :(得分:1)

在程序的某处闻起来像是一个逻辑错误。很难说 可能是什么。但我确实有一些想法......

无限循环的可能原因:

  • 未能检查文件结束条件
  • 没有正确对文件结尾作出反应
  • 测试文件结尾但假设所有其他条件都是“成功”,则读取

有时通过在每个文件后测试文件状态来确定文件结尾 I / O操作。文件状态是与文件相关联的可选2字符数据项 读/写。它被指定 在程序的FILE-CONTROL段落中。例如:

   SELECT file-name ASSIGN TO dd-name FILE STATUS fstatus

其中:file-name是您在OPEN / READ / WRITE / CLOSE语句中引用的名称。 dd-name 是外部文件名(来自JCL的DDNAME)。 fstatus是声明的双字符数据项 在工作 - 存储。

在每个文件I / O操作上设置文件状态。例如:

    READ file-name
如果没有更多要读取的记录,

fstatus设置为文件结尾。请注意文件状态 变量实际上并未在READ上引用,但已设置。

文件状态值是两个字符,并且在ISO COBOL标准中定义,它们应该 对于所有COBOL实现都是一样的。例外的文件状态值是第一个 字符是'9',这些是依赖于实现的。这是IBM Enterprise COBOL File Status values的链接 文件结尾的值为:'10' - 对于所有COBOL实现应该是相同的。

我猜你的程序对每个输入文件都有一个文件状态,但是没有检查它或对它作出反应 适当。例如,您的程序可能只检查文件结尾但不检查其他条件:

   IF fstatus = '10'
      PERFORM END-OF-FILE-LOGIC
   ELSE
      PERFORM NORMAL-LOGIC
   END-IF

这种方法的问题在于它处理正常返回(fstatus = '00')和所有非文件结束错误 条件好像READ成功了。最好有类似的东西:

   EVALUATE fstatus
       WHEN '10'
           PERFORM END-OF-FILE-LOGIC
       WHEN '00'
           PERFORM NORMAL-LOGIC
       WHEN OTHER
           PERFORM UNEXPECTED-ERROR
   END-EVALUATE

READ语句有一种命令式形式,用于指定文件结束时要执行的操作 到达了。它类似于:

   READ file-name AT END PERFORM END-OF-FILE-LOGIC END-READ

同样,如果在file-name的文件控制部分和非文件结尾中指定了文件状态 发生错误,您的程序将尝试继续“正常”逻辑 - 完全错误的事情 做。

答案 2 :(得分:1)

对于每个循环结束时的典型顺序文件匹配,您需要读取一条或多条记录。

  • 如果第一个键> =第二个键,则从第二个文件中读取。
  • 如果第二个键>第一个密钥然后从第一个文件中读取。

根据两个文件之间的一对一关系,有许多变化。但是你必须在循环结束时阅读一些内容!