2015-02-10 55 views
1

這裏是我的cobol代碼。我在我的cobol文件夾中有testinput.txt。我編譯它,它沒有錯誤,但是當我嘗試運行它,COBOL:文件狀態39錯誤

有一個消息,說 RCL0002:上<未開封的文件文件狀態39>在檢測 錯誤程序測試

段00偏移0046
IDENTIFICATION DIVISION. 
    PROGRAM-ID. transactionIN. 


    ENVIRONMENT DIVISION. 
    CONFIGURATION SECTION. 
    SOURCE-COMPUTER. IBM-PC. 
    OBJECT-COMPUTER. IBM-PC. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 
     SELECT INFILE ASSIGN TO 'testinput.txt'. 
     SELECT OUTFILE ASSIGN TO 'testoutput'. 
    DATA DIVISION. 
    FILE SECTION. 
    FD INFILE 
     LABEL RECORD IS STANDARD 
     DATA RECORD IS INREC. 
    01 INREC. 
     02 AC PIC X(99). 
    FD OUTFILE 
     LABEL RECORD IS OMITTED 
     DATA RECORD IS OUTREC. 
    01 OUTREC. 
     02 FILLER PIC X(80). 

    WORKING-STORAGE SECTION. 

    01 HEAD-1. 
     02 FILLER PIC X(32) VALUE SPACES. 
     02 FILLER PIC X(16) VALUE 'China Trust Bank'. 
     02 FILLER PIC X(32) VALUE SPACES. 
    01 HEAD-2. 
     02 FILLER PIC X(34) VALUE SPACES. 
     02 FILLER PIC X(13) VALUE 'Makati Avenue'. 
     02 FILLER PIC X(33) VALUE SPACES. 
    01 HEAD-3. 
     02 FILLER PIC X(35) VALUE SPACES. 
     02 FILLER PIC X(12) VALUE 'Makati City'. 
     02 FILLER PIC X(34) VALUE SPACES. 
    01 HEAD-4. 
     02 FILLER PIC X(33) VALUE SPACES. 
     02 FILLER PIC X(14) VALUE 'Account Report'. 
     02 FILLER PIC X(33) VALUE SPACES. 
    01 SUB-1. 
     02 FILLER PIC X(20) VALUE SPACES. 
     02 FILLER PIC X(7) VALUE 'Account'. 
     02 FILLER PIC X(10) VALUE SPACES. 
     02 FILLER PIC X(7) VALUE 'Account'. 
     02 FILLER PIC X(9) VALUE SPACES. 
     02 FILLER PIC X(7) VALUE 'Balance'. 
     02 FILLER PIC X(20) VALUE SPACES. 
    01 SUB-2. 
     02 FILLER PIC X(20) VALUE SPACES. 
     02 FILLER PIC X(6) VALUE 'Number'. 
     02 FILLER PIC X(12) VALUE SPACES. 
     02 FILLER PIC X(4) VALUE 'Name'. 
     02 FILLER PIC X(10) VALUE SPACES. 
     02 FILLER PIC X(18) VALUE SPACES. 

    SCREEN SECTION. 
    01 SCRE. 
     02 BLANK SCREEN. 
    PROCEDURE DIVISION. 
    MAIN-RTN. 
     PERFORM INIT-RTN THRU INIT-RTN-END. 
     PERFORM FINISH-RTN. 
     STOP RUN. 
    INIT-RTN. 
     OPEN INPUT INFILE, OUTPUT OUTFILE. 
     READ INFILE AT END PERFORM END-RTN 
     GO TO INIT-RTN-END. 
     PERFORM HEADING-RTN. 
    INIT-RTN-END. 
    END-RTN. 
     DISPLAY 'EMPTY FILE' LINE 3 COLUMN 20. 
    HEADING-RTN. 
     WRITE OUTREC FROM HEAD-1 AFTER PAGE. 
     WRITE OUTREC FROM HEAD-2 AFTER 1. 
     WRITE OUTREC FROM HEAD-3 AFTER 1. 
     WRITE OUTREC FROM HEAD-4 AFTER 3. 
     WRITE OUTREC FROM SUB-1 AFTER 2. 
     WRITE OUTREC FROM SUB-2 AFTER 1. 
    PROCESS-RTN. 
     DISPLAY SCRE. 
    FINISH-RTN. 
     CLOSE INFILE, OUTFILE. 
     DISPLAY 'TAPOS NA' LINE 6 COLUMN 20. 
+0

您已爲輸入指定了10個字節的固定長度記錄。這是你的數據嗎?你也沒有什麼會阻止你的程序('STOP RUN'或'GOBACK'),所以你可能會在那裏發生崩潰,而且目前唯一的區別就是第一次讀取時文件結束而不是,當你有數據時,你會得到兩套標題。看看一些示例程序。 – 2015-02-10 15:15:26

+0

是的,我有我的輸入文件中的10個字符,但我仍然得到這個錯誤。這是我的第一個cobol程序:/我不知道如何解決這個問題 – xzbxxzxzmn 2015-02-10 17:03:21

回答

3

FILE STATUS 39意味着您告訴COBOL關於該文件的內容與嘗試打開文件時發現的COBOL有什麼區別。

對於您在COBOL中定義的文件,數據必須長達99個字節。如果每個記錄有99個字節,然後是一個(或多個)分隔符,那麼您需要將INREC的長度擴展到100或101個字節。

您可能想要查看您的編譯器(來自錯誤消息,似乎是CA-Realia)是否支持LINE SEQUENTIAL文件。這種特定的文件類型可以理解分隔記錄,分隔符在被呈現給你的程序之前將被剝離。

在COBOL最簡單的文件處理程序遵循這個綱要:

OPEN files 
READ input until end 
    process input, WRITE output 
CLOSE files 

,上面寫着循環通常是兩種形式之一:

PERFORM until some-flag-shows-end-of-file 
    READ input-file 
     AT END 
      make end-of-file-flag show "end of file" 
     NOT AT END 
      do some processing 
    END-READ 
END-PERFORM 

READ input-file ("priming read") 
PERFORM until FILE STATUS field shows end-of-file 
    do some processing 
    READ input-file 
END-PERFORM 

第二個是,我的腦海裏,更簡單,更不容易出錯。它要求在文件的SELECT上使用FILE STATUS。對於所有文件,都應該始終這樣做,以便您可以在每個IO之後檢查IO未出現意外情況。爲每個文件分開FILE STATUS字段。

這是您的程序重新安排。目前,它只讀取一條記錄(或者如果文件結束立即返回,則不記錄),但這是您編寫的內容。

PROCEDURE DIVISION. 
    PERFORM INIT-RTN 
    PERFORM PROCESS-FILE 
    PERFORM END-RTN 
    PERFORM FINISH-RTN 
    STOP RUN 
    . 
INIT-RTN. 
    OPEN INPUT INFILE 
    check file status 
    OPEN OUTPUT OUTFILE 
    check file status 
    PERFORM HEADING-RTN 
    . 
PROCESS-FILE. 
    READ INFILE 
    check file status 
    . 
END-RTN. 
    DISPLAY 'EMPTY FILE' LINE 3 COLUMN 20 
    . 
HEADING-RTN. 
    WRITE OUTREC FROM HEAD-1 AFTER PAGE 
    check file status 
    WRITE OUTREC FROM HEAD-2 AFTER 1 
    check file status 
    WRITE OUTREC FROM HEAD-3 AFTER 1 
    check file status 
    WRITE OUTREC FROM HEAD-4 AFTER 3 
    check file status 
    WRITE OUTREC FROM SUB-1 AFTER 2 
    check file status 
    WRITE OUTREC FROM SUB-2 AFTER 1 
    check file status 
    . 
PROCESS-RTN. 
    DISPLAY SCRE 
    . 
FINISH-RTN. 
    CLOSE INFILE 
    check file status 
    CLOSE OUTFILE 
    check file status 
    DISPLAY 'TAPOS NA' LINE 6 COLUMN 20 
    . 

所以,檢查文件狀態,行順序,改變你的文件(或程序中定義它)。從那裏建造。

您可能認爲報告行的FILE STATUS檢查看起來很大而且很難看。你可以這樣做:

MOVE HEAD-1 TO OUTREC 
PERFORM WRITE-OUTREC-AFTER-PAGE (other neater ways to do it later) 

其中WRITE-OUTREC具有WRITE和FILE STATUS字段的測試。

相關問題