0

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

4

3 回答 3

1

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

于 2011-03-31T12:45:32.137 回答
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是在 WORKING-STORAGE 下声明的两个字符数据项。

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

    READ file-name

fstatus如果没有更多记录要读取,则将其设置为文件结尾。请注意,文件状态变量实际上并未在 上引用READ,但已设置。

文件状态值是两个字符,在 ISO COBOL 标准中定义,对于所有 COBOL 实现它们应该是相同的。例外情况是第一个字符为“9”的文件状态值,这些值取决于实现。这是指向IBM Enterprise COBOL 文件状态值 的链接 文件结尾的值是:'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-CONTROL 部分中指定了文件状态file-name并且发生了非文件结束错误,您的程序将尝试继续使用“正常”逻辑——这正是错误的做法。

于 2011-03-31T15:52:26.780 回答
1

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

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

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

于 2011-04-04T09:25:11.503 回答