2014-09-27 58 views
0

當我試圖將輸出寫入文件時,COBOL中有一個錯誤代碼18。我正在使用Micro Focus VS 2012.我嘗試了一切,但是目前似乎不能正確打印輸出。COBOL錯誤代碼18

... 
    ENVIRONMENT DIVISION. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 

     SELECT GRADE-FILE ASSIGN TO 'Grades.txt'. 

     SELECT PRINT-FILE ASSIGN TO 'Output.txt' 
     ORGANIZATION IS LINE SEQUENTIAL. 


    DATA DIVISION. 
    FILE SECTION. 
    FD GRADE-FILE 
     LABEL RECORDS ARE STANDARD. 
    01 GRADE-RECORD. 
     05 I-STUDENT PIC X(14). 
     05 I-GRADE1 PIC 999. 
     05 I-GRADE2 PIC 999. 
     05 I-GRADE3 PIC 999. 
     05 I-GRADE4 PIC 999. 
     05 I-GRADE5 PIC 999. 
     05 I-GRADE6 PIC 999. 

    FD PRINT-FILE 
     LABEL RECORDS ARE STANDARD. 
    01 PRINT-RECORD PIC X(80). 


    WORKING-STORAGE SECTION. 
    01 PROGRAM-VARIABLES. 
     05 W-AVERAGE PIC 999V99. 
     05 W-EOF-FLAG PIC X VALUE 'N'. 

    01 PAGE-TITLE. 
     05 PIC X(46) VALUE 
     ' S I X W E E K G R A D E R E P O R T'. 

    01 HEADING-LINE1. 
     05 PIC X(51) VALUE 
     ' Student  T e s t S c o r e s Average'. 

    01 HEADING-LINE2. 
     05 PIC X(51) VALUE 
     '--------------------------------------------------'. 

    01 DETAIL-LINE. 
     05     PIC X VALUE SPACE. 
     05 O-STUDENT   PIC X(14). 
     05     PIC X VALUE SPACE. 
     05 O-GRADE1   PIC ZZ9. 
     05     PIC X VALUE SPACE. 
     05 O-GRADE2   PIC ZZ9. 
     05     PIC X VALUE SPACE. 
     05 O-GRADE3   PIC ZZ9. 
     05     PIC X VALUE SPACE. 
     05 O-GRADE4   PIC ZZ9. 
     05     PIC X VALUE SPACE. 
     05 O-GRADE5   PIC ZZ9. 
     05     PIC X VALUE SPACE. 
     05 O-GRADE6   PIC ZZ9. 
     05     PIC X(4) VALUE SPACE. 
     05 O-AVERAGE   PIC ZZ9.99. 

    PROCEDURE DIVISION. 
    10-MAINLINE. 
     OPEN INPUT GRADE-FILE 
      OUTPUT PRINT-FILE 
     PERFORM 20-PRINT-HEADINGS 
     PERFORM 30-PROCESS-LOOP 
     CLOSE GRADE-FILE 
      PRINT-FILE 
     STOP RUN. 

    20-PRINT-HEADINGS. 
     MOVE PAGE-TITLE TO PRINT-RECORD 
     WRITE PRINT-RECORD AFTER ADVANCING 1 LINE 
     MOVE HEADING-LINE1 TO PRINT-RECORD 
     WRITE PRINT-RECORD AFTER ADVANCING 3 LINES 
     MOVE HEADING-LINE2 TO PRINT-RECORD 
     WRITE PRINT-RECORD AFTER ADVANCING 1 LINE. 

    30-PROCESS-LOOP. 
    * PERFORM 40-READ-RECORD 
     READ GRADE-FILE 
     PERFORM UNTIL W-EOF-FLAG = 'Y' 
      PERFORM 50-COMPUTE-GRADE-AVERAGE 
      PERFORM 60-PRINT-DETAIL-LINE 
      READ GRADE-FILE 
    *  PERFORM 40-READ-RECORD 
     END-PERFORM. 

    *40-READ-RECORD. 
    * READ GRADE-FILE 
    *  AT END MOVE 'Y' TO W-EOF-FLAG. 

    50-COMPUTE-GRADE-AVERAGE. 
     COMPUTE W-AVERAGE ROUNDED = (I-GRADE1 + I-GRADE2 + I-GRADE3 + I-GRADE4 + I-GRADE5 + I-GRADE6)/6. 

    60-PRINT-DETAIL-LINE. 
     MOVE SPACES TO DETAIL-LINE 
     MOVE I-STUDENT TO O-STUDENT 
     MOVE I-GRADE1 TO O-GRADE1 
     MOVE I-GRADE2 TO O-GRADE2 
     MOVE I-GRADE3 TO O-GRADE3 
     MOVE I-GRADE4 TO O-GRADE4 
     MOVE I-GRADE5 TO O-GRADE5 
     MOVE I-GRADE6 TO O-GRADE6 
     MOVE W-AVERAGE TO O-AVERAGE 
     WRITE PRINT-RECORD FROM DETAIL-LINE AFTER ADVANCING 1 LINE. 

    end program "GradeReport.Program1" 

S I X W E E K G R A D E R E P O R T 


Student  T e s t S c o r e s Average 
-------------------------------------------------- 
KellyAntonetz0 700 500 980 800 650 852 747.00 
obertCain09708 207 907 309 406 2;1 25> 400.67 
Dehaven0810870 940 850 930 892 122 981 785.83 
rmon0760770800 810 750 92; 142 9>1 <1> 816.33 
g0990930890830 940 901 =1> 41= ?82 65 872.50 
06707108408809 6=9 ;52 565 <<0 900 870 924.33 
78052076089Woo 493 9>4 520 760 760 830 734.50 
+1

這將是很好的指定錯誤發生的地方,例如在OPEN或WRITE中?也使用FILE STATUS,對輸入和輸出分別打開OPEN並查看錯誤18在編譯器中的含義。 – NoChance 2014-09-27 06:24:39

+1

您不顯示樣本輸入數據。第一行輸出中的'z0'是可疑的 - 如果我是你,我會查看你的文件組織。報告主體中的「數字」數據應該給你一個線索。有一位名叫'obert ...'的學生很不尋常,這表明你的輸入數據沒有被正確讀取 - 從那裏開始,它就是GIGO。您似乎正在從具有可變長度數據記錄的文件中讀取固定長度的記錄。 – Magoo 2014-09-27 06:50:41

+0

EmmadKareem的建議很好,Magoo發現了一些關鍵。你需要顯示你的輸入記錄。看起來應該將名字的前兩個元素分隔在第一個記錄上的空間不知何故(缺少COBOL),正如名字中的其他空格一樣。您的輸入數據長度可變,影響名稱字段,並導致您的所有其他字段向左「拉」。在COBOL計劃之前,「某事」已經佔據了你名字的所有空間。 – 2014-09-27 09:09:26

回答

2

在您的COBOL程序之前的某些東西通過刪除所有空格並將數據移動到左側來清理文件。

你的第一個學生顯示爲KellyAntonetz,但可能應該是Kelly Antonetz。由於只有一個空間被刪除,因此等級數據只向左移動了一個位置,所以數字仍然可以識別,雖然平均數是10的因子,但它大致正確。

由於跟在85之後,它實際上並不正確(除了10的冪)。 2從哪裏來的?

它來自下一個記錄,其中第一個名字應該是羅伯特,但你顯示爲obertCain09708。字母R的ASCII碼是X'82'。當被COBOL視爲數字時,8將被忽略(或者在數字的尾部字節中時會導致崩潰)。您的編譯器不會導致代碼崩潰,但會將R視爲數字2

obertCain只有14個字節中的名稱。這次「丟失」的五個空格/空白導致數字被左移五個字節。從這一點開始,解釋你展示的輸出如何符合推測的輸入,只能成爲一種學術活動。

進一步支持,是這將是從微距對焦編譯器18的文件狀態碼,這裏的引用:http://www.simotime.com/vsmfsk01.htm

它說,爲18

Read part record error: EOF before EOR or file open in wrong mode (Micro Focus).

你的最終戰績會「完成「之前,在讀取32個字節之前檢測到文件結束。

請注意,錯誤在您的輸入文件,而不是您的輸出文件。

以這種方式丟失空格可以通過很多方式完成,所以我無法在文件到達COBOL程序之前猜到你對文件做了什麼,但COBOL本身和你的代碼都沒有這樣做。

記下Emmad Kareem的評論。使用FILE STATUS。在每個IO之後檢查文件狀態字段(每個文件定義一個字段),以便知道問題何時發生以及問題是什麼。

在正在讀取的文件上測試文件狀態字段爲10時,會得到比READ上的AT END更乾淨的代碼。

請注意,如果你的程序沒有在那裏崩潰,它會無限循環或不久後崩潰。可能在試圖解決您的問題時,您已經評論了您對「閱讀段落」的使用,並且該段落是您設置文件結束的唯一位置。

如果您使用文件狀態而不是AT END,則不需要定義標誌/開關,您可以在文件狀態字段上使用88,並讓COBOL運行時直接爲您設置它,而不必編碼。

只是關於您的詳細信息線的幾點。

當你移動到每個命名字段,並且(未命名)FILLER具有VALUE SPACE時,沒有必要使用MOVE SPACE

你不需要必需需要(未命名)FILLERS。試試這個:

01 DETAIL-LINE. 
     05 O-STUDENT   PIC BX(14). 
     05 O-GRADE1   PIC ZZZ9. 
     05 O-GRADE2   PIC ZZZ9. 
     05 O-GRADE3   PIC ZZZ9. 
     05 O-GRADE4   PIC ZZZ9. 
     05 O-GRADE5   PIC ZZZ9. 
     05 O-GRADE6   PIC ZZZ9. 
     05 O-AVERAGE   PIC Z(6)9.99. 

如果你使用COBOL,你可能會看到這種類型的東西,所以很高興知道。大量的輸出可能會導致性能下降。您可能會發現將「排隊」輸出到標題更方便。

啊。把你的輸入文件不使用LINE SEQUENTIAL,我預測你有一個在腳本運行一段時間之前運行一段時間的腳本,它應該在每個腳本的末尾刪除記錄終止符(無論你的操作系統上有哪些)邏輯記錄,但是您意外地從記錄的所有位置中刪除了全部whitespace

使用LINE SEQUENTIAL您可以擁有固定長度的記錄,這些記錄恰好也是「終止」的。除非練習特別包括刪除記錄終止符,否則只需使用LINE SEQUENTIAL

如果您應該刪除終結符,則不要這樣做,因爲whitespace涵蓋的內容太多(具體而言),也會將更改「錨定」到記錄結尾。