COBOL中的文件处理

COBOL中的文件处理,cobol,Cobol,我想编写一个cobol程序来读取包含4个字段(EMPID、NAME、STREAM、GRADE)的EMP-GRADE文件,并显示在输出中获得“a”级分数的员工的详细信息。我使用在线Cobol编译器 IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE1. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT EMPFILE ASSIGN TO 'input.txt' ORGANIZAT

我想编写一个cobol程序来读取包含4个字段(EMPID、NAME、STREAM、GRADE)的EMP-GRADE文件,并显示在输出中获得“a”级分数的员工的详细信息。我使用在线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

列表中没有一个年级的学生“

您正在使用

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.
根据练习的实际要求,可能还有许多其他的改进,但我认为这解决了您当前的问题

请注意,两个独立的
执行
READ-PARA的
。第一种方法有时称为启动读取,这是一种非常有用的学习方法。

尝试以下代码:

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.

为什么不从Sorseforge下载GnuCOBOL呢。我认为你不能用任何在线编译网站来编写文件(但我可能错了)。你不可能得到正确的输出,因为你只有一次写操作发生在输入文件的末尾,并且只有在最后一条记录仍然可用(取决于编译器)并且只有在它是A的情况下才会执行。与其显示整个记录,不如只显示你感兴趣的字段,这是一种查看测试数据是否与字段定义匹配的简单方法(有时人们喜欢编译/链接/重新运行以节省计算工作量)。从您展示的示例中,这是一个大而平的NO.@BillWoodger,正如您所建议的,我下载了离线COBOL编译器,并编译了我的代码,但我有一些疑问,在离线编译器中,我应该如何添加输入文件和输出文件?这是一个新问题,对于so的Q^a格式来说并不太好。如果您回到SourceForge for GnuCOBOL,您将发现一个讨论区域,其中甚至可以讨论最基本的问题(而不仅仅是回答)。还有加里·卡特勒的手册,-有不止一种方法可以做你想做的事,但是如果你看一下SELECT,它应该会让你走。你是如何获得投票的?它看起来很可怕,而且不起作用。您需要了解如何使用SELECT的FILE STATUS子句,并在每个IO之后检查FILE STATUS字段。末端/非末端缠结是一团乱。为输入文件使用文件状态字段的值可以使这变得简单明了,尤其是在使用88时。为什么是THRU,而不是初学者使用它。这是不必要的。为什么这场战争还在继续?主段或其出口中没有目的。您应该测试它,让它工作,并尝试改进它,它将改进您的COBOL编码。