IDENTIFICATION DIVISION.
PROGRAM-ID. PROGRAM1.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMP-GRADE ASSIGN TO 'input.txt'
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-STATUS.
DATA DIVISION.
FILE SECTION.
FD EMP-GRADE.
01 NEWFILE.
05 FS-EMPID PIC 9(5).
05 FS-NAME PIC A(5).
05 FS-STREAM PIC X(5).
05 FS-GRADE PIC A(1).
05 FILLER PIC X(64).
WORKING-STORAGE SECTION.
01 WS-EOF PIC A(1) VALUE "N".
01 WS-STATUS PIC X(2).
PROCEDURE DIVISION.
MAIN-PARA.
OPEN INPUT EMP-GRADE.
PERFORM PARA1 THRU PARA1-EXIT UNTIL WS-EOF="Y".
CLOSE EMP-GRADE.
STOP RUN.
MAIN-PARA-EXIT.
EXIT.
PARA1.
READ EMP-GRADE
AT END MOVE "Y" TO WS-EOF
NOT AT END
IF FS-GRADE='A'
DISPLAY FS-EMPID , FS-NAME , FS-STREAM , FS-GRADE
END-IF
END-READ.
PARA1-EXIT.
EXIT.
提供的输入:
1234 sita comp A
2345 tina main B
5689 riya math A
但输出即将到来:
1234 sita comp A
它只读取第一条记录。
正如Brian Tiffin在评论中暗示的那样,问题在于您的数据。
这:
05 FILLER PIC X(64).
意味着您的记录应比实际长度长 64 个字节。
如果在 FD 下有固定长度的记录或只有固定长度的记录,则所有数据都必须具有相同的长度,并且与您在程序中定义的长度相同。
这意味着,行为取决于编译器,就 COBOL 程序而言,您只有一条记录。
发现此类情况的一个好方法是始终计算输入记录,并计算输出记录以及不应选择输出的记录。然后,您可以轻松判断是否有任何东西掉在裂缝之间。
撇开这一点不谈,这是您的程序,并进行了一些调整:
IDENTIFICATION DIVISION.
PROGRAM-ID. PROGRAM1.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMP-GRADE ASSIGN TO 'input.txt'
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-STUDENT-GRADE-STATUS.
DATA DIVISION.
FILE SECTION.
FD EMP-GRADE.
01 NEWFILE.
05 FS-EMPID PIC 9(5).
05 FS-NAME PIC X(5).
05 FS-STREAM PIC X(5).
05 FS-GRADE PIC X(1).
05 FILLER PIC X(64).
WORKING-STORAGE SECTION.
01 WS-STUDENT-GRADE-STATUS PIC X(2).
88 END-OF-STUDENT-GRADE-FILE VALUE "10".
88 ERROR-ON-STUDENT-GRADE-FILE VALUE ZERO.
PROCEDURE DIVISION.
OPEN INPUT EMP-GRADE
* perform a paragraph to check FILE STATUS field is zero, using an 88.
PERFORM PRIMING-READ
PERFORM PROCESS-STUDENT-GRADE-FILE
UNTIL END-OF-STUDENT-GRADE-FILE
CLOSE EMP-GRADE
* perform a paragraph to check FILE STATUS field is zero, using an 88.
GOBACK
.
PRIMING-READ.
PERFORM READ-STUDENT-GRADE
.
READ-STUDENT-GRADE.
READ EMP-GRADE
* perform a paragraph to check FILE STATUS field is zero, using an 88.
.
PROCESS-STUDENT-GRADE-FILE.
IF FS-GRADE='A'
* To see the problem with your data, DISPLAY the 01-level
DISPLAY NEWFILE
DISPLAY FS-EMPID
FS-NAME
FS-STREAM FS-GRADE
END-IF
PERFORM READ-STUDENT-GRADE
.
如果您使用"文件状态"字段,则应对其进行检查。由于您使用它,您可以使用它来检查文件结尾,而无需AT END
。如果您使用"启动读取",则不需要AT END/NOT AT END
纠结。如果您在PROCEDURE DIVISION
中编码句号/句点的最小值,则不会有问题。从不需要逗号,所以不要使用它们。格式化程序以提高人类可读性。对所有内容使用良好的描述性名称。PERFORM
上的THRU
邀请使用GO TO
。作为一种学习,避免邀请。
如果您的类本身强制实施特定的方法来编写 COBOL 代码,则必须使用这些方法。如果是这样,我建议你两者都做。至少前几次,两者都提交给你的导师。即使他们告诉你不要这样做,在给定任务时继续做双重示例(只是不要再提交它们了)。你没有理由从坏习惯开始。
让一切简单。如果您的代码看起来很糟糕,请通过简化和格式化使其看起来不错。
还要记住,COBOL 是关于固定长度的东西。让我们回到你原来的问题。