从文件中读取 table 只会导致存储第一条记录

Reading a table from a file only results in the first record being stored

其他背景:这是 的后续行动。

由于输入数据为字符串,计算需要整数,本程序批量读取每一行,然后从文件中单独读取每个字段,并将需要的字段转换为数字,存储到工作存储区table.

现在,由于某种原因,只有第一条记录可以正确读取和存储。其余记录被读取为空白或空值,我猜,即使第一条记录之后的文件内容显然不为空。

这是我当前的完整程序代码:

    IDENTIFICATION DIVISION.
    PROGRAM-ID. GRADEREPORT.
    AUTHOR. JORDAN RENAUD.
    DATE-WRITTEN. 09/18/2020.
    
    ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
    FILE-CONTROL.
           SELECT GRADES-FILE ASSIGN TO "bill"
               ORGANIZATION IS LINE SEQUENTIAL
               ACCESS IS SEQUENTIAL.
    
    DATA DIVISION.
    FILE SECTION.
    FD GRADES-FILE.
    01     INPUT-TOTAL-POINTS       PIC 9(4).
    01     INPUT-GRADES.
    05         INPUT-GRADE OCCURS 1 to 100 TIMES DEPENDING ON RECORD-COUNT.
    10            INPUT-ASSIGNMENT-NAME   PIC X(20).
    10            INPUT-CATEGORY          PIC X(20).
    10            INPUT-POINTS-POSSIBLE   PIC X(14).
    10            INPUT-POINTS-EARNED     PIC X(14).
    
    WORKING-STORAGE SECTION.
    77     GRADES-FILE-EOF          PIC 9.
    01     RECORD-COUNT             PIC 9(8) VALUE 0.
    01     TOTAL-EARNED-POINTS      PIC 9(14) VALUE ZERO.
    01     TOTAL-POSSIBLE-POINTS    PIC 9(14) VALUE 5.
    01     K                        PIC 9(14) VALUE 1.
    01     TMP                      PIC 9(14).
    01     CURRENT-CATEGORY         PIC X(20).
    01     CATEGORY-WEIGHT          PIC X(3).
    01     LAST-CATEGORY            PIC X(20).
    01     TOTAL-POINTS             PIC 9(4).
    01     GRADES.
    05         GRADE OCCURS 1 TO 100 TIMES DEPENDING ON RECORD-COUNT.
    10            ASSIGNMENT-NAME   PIC X(20).
    10            CATEGORY          PIC X(20).
    10            POINTS-POSSIBLE   PIC 9(14).
    10            POINTS-EARNED     PIC 9(14).
    
    PROCEDURE DIVISION.
           OPEN INPUT GRADES-FILE.
           READ GRADES-FILE INTO TOTAL-POINTS.
           DISPLAY TOTAL-EARNED-POINTS
           PERFORM UNTIL GRADES-FILE-EOF = 1
               READ GRADES-FILE
                  AT END SET
                  GRADES-FILE-EOF TO 1
                  NOT AT END
                     ADD 1 TO RECORD-COUNT
    
                     MOVE INPUT-ASSIGNMENT-NAME(RECORD-COUNT) TO ASSIGNMENT-NAME(RECORD-COUNT)
                     DISPLAY INPUT-ASSIGNMENT-NAME(RECORD-COUNT)
                     DISPLAY ASSIGNMENT-NAME(RECORD-COUNT)
    
                     MOVE INPUT-CATEGORY(RECORD-COUNT) TO CATEGORY(RECORD-COUNT)
                     DISPLAY INPUT-CATEGORY(RECORD-COUNT)
                     DISPLAY CATEGORY(RECORD-COUNT)
    
                     MOVE FUNCTION NUMVAL (INPUT-POINTS-POSSIBLE(RECORD-COUNT)) TO POINTS-POSSIBLE(RECORD-COUNT)
                     DISPLAY INPUT-POINTS-POSSIBLE(RECORD-COUNT)
                     DISPLAY POINTS-POSSIBLE(RECORD-COUNT)
    
                     MOVE FUNCTION NUMVAL (INPUT-POINTS-EARNED(RECORD-COUNT)) TO POINTS-EARNED(RECORD-COUNT)
                     DISPLAY INPUT-POINTS-EARNED(RECORD-COUNT)
                     DISPLAY POINTS-EARNED(RECORD-COUNT)
    
                     COMPUTE TOTAL-EARNED-POINTS = TOTAL-EARNED-POINTS + POINTS-EARNED(RECORD-COUNT)
                     DISPLAY TOTAL-EARNED-POINTS
               END-READ
           END-PERFORM.
           CLOSE GRADES-FILE.
           DISPLAY TOTAL-EARNED-POINTS.
           SORT GRADE ASCENDING CATEGORY.
           MOVE CATEGORY(1) TO LAST-CATEGORY.
           PERFORM RECORD-COUNT TIMES
               MOVE CATEGORY(K) TO CURRENT-CATEGORY
               IF CURRENT-CATEGORY = LAST-CATEGORY THEN
                  DISPLAY "SAME CATEGORY"
               ELSE
                  DISPLAY "NEW CATEGORY"
                  MOVE LAST-CATEGORY TO CURRENT-CATEGORY
               END-IF
               SET K UP BY 1
           END-PERFORM
           DISPLAY GRADES.
           STOP RUN.

这里是输入文件,bill:

1000
MS 1 - Join Grps    Group Project       5             5             
Four Programs       Programming         15            9             
Quiz 1              Quizzes             10            7             
FORTRAN             Programming         25            18            
Quiz 2              Quizzes             10            9             
HW 1 - Looplang     Homework            20            15            

根据编写的代码,从文件的 table 部分读取的第一行(第 2 行及之后)的各个部分显示如下:

MS 1 - Join Grps    
MS 1 - Join Grps    
Group Project       
Group Project       
5             
00000000000005
5             
00000000000005

这是我所期望的。每一项都是重复的,第一次迭代是输入文件结构,第二次是工作存储段结构。不同之处在于输入结构被读取为所有长度为 20 和 14 的字符串,存储结构被格式化为两个长度为 20 的字符串和两个长度为 14 的整数。如前所述,数字字符串被转换为 int 并存储在工作存储器中。 第二行DISPLAYs的输出显示如下:

00000000000000
              
00000000000000
00000000000005
                    
                    
                    
                    
              
00000000000000
              
00000000000000
00000000000005
                    
                    
                    
                    
              
00000000000000
              
00000000000000
00000000000005
                    
                    
                    
                    
              
00000000000000
              
00000000000000
00000000000005
                    
                    
                    
                    
              
00000000000000
              
00000000000000
00000000000005

在这种情况下,00000000000005 是求和累加器变量的总和,它始终为 5,因为第一行读取的分数为 5,其余部分的计算结果为零,因为他们被读作空白。

如何让我的程序正确读取文件的其余部分?

事实证明,当从文件中读取 table 时,访问当前行的下标始终为 1,因此不是读取 RECORD-COUNT 作为 INPUT-items 的下标,我只为所有这些设置了 1,程序按预期运行!