2014-10-19 72 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