2014-10-19 33 views
-2

我想編寫一個cobol程序來讀取帶有4個字段(EMPID,NAME,STREAM,GRADE)的文件EMP-GRADE,並顯示在輸出中得分爲'A'的員工的詳細信息。我使用在線Cobol編譯器。COBOL中的文件處理

IDENTIFICATION DIVISION. 
PROGRAM-ID. SAMPLE1. 
ENVIRONMENT DIVISION. 
INPUT-OUTPUT SECTION. 
FILE-CONTROL. 
SELECT EMPFILE ASSIGN TO 'input.txt' 
ORGANIZATION IS SEQUENTIAL 
ACCESS MODE IS SEQUENTIAL 
FILE STATUS IS WS-FILE-STATUS. 
SELECT EMPA ASSIGN TO 'util.cobc' 
ORGANIZATION IS SEQUENTIAL 
ACCESS MODE IS SEQUENTIAL. 
DATA DIVISION. 
FILE SECTION. 
FD EMPFILE. 
01 NEWFILE. 
05 FS-EMPID PIC 9(6). 
05 FILLER PIC X(50). 
05 FS-NAME PIC A(10). 
05 FILLER PIC X(50). 
05 FS-STREAM PIC A(10). 
05 FILLER PIC X(50). 
05 FS-GRADE PIC A(1). 
05 FILLER PIC X(50). 
FD EMPA. 
01 OUTFILE. 
05 FS-EMPID-OUT PIC 9(6). 
05 FILLER PIC X(50). 
05 FS-NAME-OUT PIC A(10). 
05 FILLER PIC X(50). 
05 FS-STREAM-OUT PIC A(10). 
05 FILLER PIC X(50). 
05 FS-GRADE-OUT PIC A(1). 
05 FILLER PIC X(50). 
WORKING-STORAGE SECTION. 
01 WS-EOF PIC A(1) VALUE "N". 
01 WS-FILE-STATUS PIC X(2). 
PROCEDURE DIVISION. 
MAIN-PARA. 
OPEN INPUT EMPFILE 
OPEN OUTPUT EMPA 
PERFORM READ-PARA THRU READ-PARA-EXIT 
Perform Until WS-EOF = "Y" 
    IF FS-GRADE='A' 
     MOVE NEWFILE TO OUTFILE 
     WRITE OUTFILE 
     END-WRITE 
     DISPLAY OUTFILE 
    ELSE 
    DISPLAY 'NO A GRADE STUDENT IN THE LIST' 
    END-IF 
    PERFORM READ-PARA THRU READ-PARA-EXIT 
    END-PERFORM 
CLOSE EMPFILE. 
CLOSE EMPA. 
STOP RUN. 
MAIN-PARA-EXIT. 
EXIT. 
READ-PARA. 
READ EMPFILE 
AT END MOVE "Y" TO WS-EOF 
NOT AT END DISPLAY NEWFILE 
END-READ. 
READ-PARA-EXIT. 
EXIT. 

上面的是我更新代碼,然後我在「input.txt中」給輸入和我輸出如下

11111 AISHU JAVA B 
22222 RANJU MAINF A 

NO甲年級學生在列表」

+0

你爲什麼不從SorceForge下載GnuCOBOL。我不認爲你可以用任何在線編譯站點寫一個文件(但我可能是錯的)。你無法正確地得到輸出,因爲你只有一個WRITE發生在輸入文件結束後,並且只有在最後一個記錄仍然可用時纔會執行(取決於編譯器),並且只有當它是A 。 – 2014-10-19 20:31:55

+1

而不是顯示整個記錄,爲什麼你不顯示你感興趣的領域,只是,這是一個簡單的方法(有時候人們喜歡編譯/鏈接/重新運行以節省計算工作量)看到如果您的測試數據符合您的字段定義。從你展示的樣本來看,這是一個很大的平坦的NO。 – 2014-10-20 07:42:33

+0

@BillWoodger如您所說,我下載了脫機COBOL編譯器,並編譯了我的代碼,但我對此有所疑問,在離線編譯器中,我應該如何添加輸入文件和輸出文件? – 2014-10-23 06:11:17

回答

1

您正在讀取您的整個輸入文件,其中包括

PERFORM READ-PARA THRU READ-PARA-EXIT UNTIL WS-EOF="Y" 

聲明。你必須讀取一條記錄,處理它,讀取下一條記錄,處理它,等等。

OPEN INPUT EMPFILE 
OPEN OUTPUT EMPA 
PERFORM READ-PARA THRU READ-PARA-EXIT 

Perform Until WS-EOF = "Y" 
    IF FS-GRADE='A' 
     MOVE NEWFILE TO OUTFILE 
     WRITE OUTFILE 
     DISPLAY OUTFILE 
    END-IF 
    PERFORM READ-PARA THRU READ-PARA-EXIT 
End-Perform 

CLOSE EMPFILE 
CLOSE EMPA 
STOP RUN. 

根據鍛鍊的實際要求,可能還有其他許多改進,但我認爲這解決了您的直接問題。

請注意兩個單獨的PERFORMsREAD-PARA。第一個有時被稱爲啓動讀取,這是一個有用的技術學習。

2

試試這個代碼:

PROCEDURE DIVISION. 
MAIN-PARA. 
    OPEN INPUT EMPFILE 
    OPEN OUTPUT EMPA 
    PERFORM READ-PARA THRU READ-PARA-EXIT UNTIL WS-EOF = ‘Y’ 
    CLOSE EMPFILE. 
    CLOSE EMPA. 
    STOP RUN. 
MAIN-PARA-EXIT. 
    EXIT. 
READ-PARA. 
    READ EMPFILE 
     AT END 
      MOVE "Y" TO WS-EOF 
      IF WS-F='M' THEN 
       DISPLAY 'NO A GRADE STUDENT IN THE LIST' 
      END-IF 
     NOT AT END DISPLAY NEWFILE 
      IF FS-GRADE='A' THEN 
       MOVE ‘M’ TO WS-F 
       MOVE NEWFILE TO OUTFILE 
       WRITE OUTFILE 
       END-WRITE 
       DISPLAY OUTFILE 
      ELSE 
       CONTINUE 
      END-IF 
    END-READ. 
READ-PARA-EXIT. 
    EXIT. 
+0

你是如何得到贊成的?它看起來很可怕,而且不起作用。您需要查看使用SELECT的FILE STATUS子句,並在每個IO之後檢查文件狀態字段。 AT END/NOT END糾結是一團糟。使用輸入文件的文件狀態字段的值可以使這一點變得簡單明瞭,特別是在使用88s時。爲什麼THRU,除了初學者使用它。這是沒有必要的。爲什麼ELSE中的CONTINUE?主要參與者或其退出沒有目的。你應該測試它,讓它工作,並嘗試改進它,它會改善你的COBOL編碼。 – 2015-04-18 19:45:30