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

时间:2014-11-15 09:17:53

标签: 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-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 

它只读取第一张唱片。

1 个答案:

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