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

Cobol 读取一个包含三条记录的文件,只输出一条预期记录,cobol,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.

提供的输入:

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  
但输出即将到来:

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  

它只读取第一条记录。

正如Brian Tiffin在评论中暗示的那样,问题在于你的数据

这:

1234 sita comp A 
意味着您的记录应该比实际长度长64字节

如果FD下有固定长度的记录,或者只有固定长度的记录,那么所有数据都必须具有相同的长度,并且等于您在程序中定义的长度

这意味着,行为取决于编译器,就COBOL程序而言,您只有一条记录

发现这些情况的一个好方法是,始终统计输入记录、输出记录以及不应选择输出的记录。然后,您可以很容易地判断是否有任何东西落在裂缝之间

撇开这一点不谈,以下是您的计划,并进行了一些调整:

  05 FILLER     PIC X(64).
如果使用文件状态字段,则应选中该字段。因为您使用它,所以可以使用它检查文件的结尾,而不必在结尾处使用
。如果使用“启动读取”,则不需要结尾处的
/非结尾处的
纠结。如果在
程序部分
中对最短的句号/时段进行编码,则不会出现问题。逗号永远不需要,所以不要使用它们。设置程序的格式以使其具有可读性。对每件事都使用好的描述性名称。
执行
上的
邀请使用
转到
。作为学习者,避免邀请

如果您的类本身强制使用特定的方法来编写COBOL,那么您必须使用这些方法。如果是的话,我建议你两者都做。至少在前几次,都要提交给你的导师。即使他们告诉你不要这样做,在给定任务时继续做双重示例(只是不要再提交它们)。你没有理由一开始就养成坏习惯

保持一切简单。如果您的代码看起来不好,请通过简化和格式化使其看起来不错


还要记住,COBOL是关于固定长度的东西。让我们回到您原来的问题。

尝试在新文件中显示输入字段,查看是否由于短记录或长记录而出现任何偏移。(取出IF,应该这样做)