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,应该这样做)