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