读取包含三条记录的文件,仅输出一条预期记录


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 是关于固定长度的东西。让我们回到你原来的问题。

最新更新