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
它只读取第一张唱片。
答案 0 :(得分:2)
正如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
.
如果您使用FILE STATUS字段,则应检查它。由于您使用它,您可以使用它来检查没有AT END
的文件结尾。如果使用“启动读取”,则不需要AT END/NOT AT END
纠结。如果您在PROCEDURE DIVISION
中编码最小的句号/句号,则不会对它们产生任何问题。从不需要逗号,所以不要使用它们。格式化程序以提高人类可读性。为所有内容使用良好的描述性名称。 THRU
上的PERFORM
会邀请使用GO TO
。作为一种学习,请避免邀请。
如果您的类本身强制执行特定的COBOL编码方式,则必须使用这些方法。如果是这样,我建议你两个都做。至少前几次,向你的导师提交。即使他们告诉你不要这样做,在给定任务时继续做双重例子(只是不再提交它们)。没有理由让你开始养成坏习惯。
保持一切简单。如果您的代码看起来很糟糕,请通过简化和格式化使其看起来很好。
还记得COBOL是关于固定长度的东西。让我们回到原来的问题。