Cobol程序从第一个平面文件中读取记录,并将其与第二个平面文件中的第一个记录进行比较。但是,因为第一个平面文件中的第一个记录与第二个平面文件中的任何记录都不匹配,所以Cobol程序进入无限循环。我该如何解决?
答案 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)
对于每个循环结束时的典型顺序文件匹配,您需要读取一条或多条记录。
根据两个文件之间的一对一关系,有许多变化。但是你必须在循环结束时阅读一些内容!