Cobol程序從第一個平面文件中讀取記錄,並將其與第二個平面文件中的第一個記錄進行比較。但是,由於第一個平面文件的第一條記錄與第二個平面文件上的任何記錄不匹配,所以Cobol程序進入無限循環。我如何解決它?如果在兩個平面文件中找不到匹配項,我該如何防止Cobol程序進入無限循環?
回答
聞起來像程序中某處的邏輯錯誤。很難說 可能是什麼。但我確實有一些想法...
一個無限循環的可能原因:
- 故障檢查檔案結尾條件
- 沒有反應,最終的文件正確
- 測試對於結束文件,但假定所有其他條件都「成功」讀取文件的
結束有時由每個 I/O操作後測試文件狀態確定。 「文件狀態」是一個可選的2字符數據項,與讀取/寫入文件 相關。它在程序的FILE-CONTROL段落中被指定爲 。例如:
SELECT file-name ASSIGN TO dd-name FILE STATUS fstatus
其中:file-name
是你指的是OPEN /讀/寫/ 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」)和所有非最終文件錯誤 的條件,如果讀取成功。最好有類似:
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
一個文件狀態和非檔案結尾發生 錯誤,你的程序將試圖繼續「正常'邏輯 - 完全是錯誤的事情是 在做。
在文件結束時,讀取的最後一條記錄保留在記錄區域中。所以如果你不檢查文件結束的情況,你的程序不會停止運行。
至少幾年前,如果沒有'AT END'子句和'EOF'到達,通常的COBOL編譯器會生成代碼來取消程序... – 2011-03-31 13:33:50
在每個你需要閱讀更多的記錄一個循環的結束典型順序文件匹配。
- 如果第一個鍵≥第二個鍵然後從第二個文件讀取。
- 如果第二個鍵>第一個鍵然後從第一個文件讀取。
根據兩個文件之間的一對一關係,有許多變化。但是你必須在循環結尾閱讀一些東西!
- 1. 該程序進入無限循環
- 2. 如何防止python子進程中的無限循環?
- 3. 如何防止無限循環寫入文件
- 4. 如何防止有兩個EditTexts的無限循環?
- 5. 如何防止節點無限循環?
- 6. IP如何防止無限循環?
- 7. 如何防止循環中的布爾值無限循環?
- 8. 防止無限循環
- 9. Prolog中的無限循環。我如何防止這種情況?
- 10. 匹配查找無限循環
- 11. 如何停止在Python線程(我有一個無限循環)
- 12. 我如何在python中無限循環這個程序?
- 13. 如果cout丟失,循環進入無限循環
- 14. 如何終止無限循環(線程)
- 15. 找不到無限循環
- 16. 防止java中的無限循環
- 17. 防止jQuery中的無限循環
- 18. 如何阻止這個無限循環
- 19. (C++)不會在std :: cin中停止並進入無限循環?
- 20. 如何在IRB中的兩個數組中找到匹配項?
- 21. 回聲「找不到結果」如果找不到匹配項
- 22. 如何防止Jackson中的無限循環JSON數組?
- 23. 如何防止ASP.net中的無限循環
- 24. 如何調試並防止PHP中的無限循環?
- 25. 跳轉到下一個循環,如果匹配條件在groovy
- 26. 如何在glassfishv3中找到一個無限循環
- 27. 如何防止兩個路由在react-router v4中匹配?
- 28. COBOL如何排序和合並兩個無序文件?
- 29. 如何在我的程序中跳出無限循環
- 30. 如何在兩個表中找到非匹配項?
即使使用COBOL,它也有助於查看代碼。 – 2011-03-31 12:40:59