2011-03-31 16 views

回答

1

聞起來像程序中某處的邏輯錯誤。很難說 可能是什麼。但我確實有一些想法...

一個無限循環的可能原因:

  • 故障檢查檔案結尾條件
  • 沒有反應,最終的文件正確
  • 測試對於結束文件,但假定所有其他條件都「成功」讀取文件的

結束有時由每個 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一個文件狀態和非檔案結尾發生 錯誤,你的程序將試圖繼續「正常'邏輯 - 完全是錯誤的事情是 在做。

1

在文件結束時,讀取的最後一條記錄保留在記錄區域中。所以如果你不檢查文件結束的情況,你的程序不會停止運行。

+0

至少幾年前,如果沒有'AT END'子句和'EOF'到達,通常的COBOL編譯器會生成代碼來取消程序... – 2011-03-31 13:33:50

1

在每個你需要閱讀更多的記錄一個循環的結束典型順序文件匹配。

  • 如果第一個鍵≥第二個鍵然後從第二個文件讀取。
  • 如果第二個鍵>第一個鍵然後從第一個文件讀取。

根據兩個文件之間的一對一關係,有許多變化。但是你必須在循環結尾閱讀一些東西!