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

Cobol 从文件中读取表只会导致存储第一条记录,cobol,gnucobol,Cobol,Gnucobol,其他背景:这是一项后续行动 由于输入数据由字符串和计算所需的整数组成,此程序批量读取每一行,然后分别从文件中读取每个字段,并在将必要字段存储在working storage section表中时将其转换为数字 现在,由于某种原因,只有第一条记录正确读取和存储。我猜,其余的记录被读取为空白或空,即使第一条记录之后的文件内容显然不是空的 以下是我当前的完整程序代码: IDENTIFICATION DIVISION. PROGRAM-ID. GRADEREPORT. AUTHO

其他背景:这是一项后续行动

由于输入数据由字符串和计算所需的整数组成,此程序批量读取每一行,然后分别从文件中读取每个字段,并在将必要字段存储在working storage section表中时将其转换为数字

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

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

    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.
这是输入文件,比尔:

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            
根据编写的代码,从文件表部分读取的第一行(第2行及以后)的各个部分显示如下:

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

00000000000000
              
00000000000000
00000000000005
                    
                    
                    
                    
              
00000000000000
              
00000000000000
00000000000005
                    
                    
                    
                    
              
00000000000000
              
00000000000000
00000000000005
                    
                    
                    
                    
              
00000000000000
              
00000000000000
00000000000005
                    
                    
                    
                    
              
00000000000000
              
00000000000000
00000000000005
在这种情况下,
0000000000000 5
是一个累加器变量的总和,它始终是5,因为第一行读取的所得分数为5,而其余的则只是计算为零,因为它们被读取为空白


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

事实证明,从文件读取表时,访问当前行的下标始终为1,因此,我没有将记录计数作为输入项的下标来读取,而是将1作为所有输入项的下标,程序按预期工作

结果是,当从文件中读取一个表时,访问当前行的下标总是1,因此,我没有将RECORD-COUNT作为输入项的下标来读取,而是将所有输入项的下标都设为1,程序按预期工作

出于兴趣:
-debug
不会引发异常?快速浏览一下,您可能希望从输入文件中删除ODO(
发生取决于
)。您可能希望使用
EXIT-PERFORM
,而不是设置然后检查eof变量和/或将代码拆分为
部分(或仅限cobol85之前的样式段落),以提高可读性(但这更像是一个样式问题,所以请注意)。如果你能自己解决问题,请自我回答(Q&A-stye),否则请在编辑后留下一条注释。注意:我已经按照SO规则编辑了你的问题,请查看编辑。我们可以通过自动“清理”的评论进行聊天,但投票结果较高的评论除外[这些评论旨在“洞察问题/答案”]或通过讨论板进行聊天。另一个注意事项:将其作为附加问题发布是很好的,您的问题显示了研究结果,因此它们在这里是完美的匹配。我感谢您的洞察力和编辑,这些都是我可以做的,但我唯一的真正目标是有一个工作程序,它接受定义的输入,并返回定义的输出报告。基本上,在这门编程语言课上,我们被分配了小组和一个叫做“四个程序”的作业。首先,我们可以用我们想要的任何语言实现它们。然后我们必须在Fortran 66(IV)中完成,现在是Cobol。因此,我们不需要了解获得所需输出所需的算法,而需要了解如何用不同的语言实现相同的ALG,并观察您编写程序所用的语言(2)如何简化过程。哦,回答您的问题,将-debug标志添加到my launch.json并没有真正改变控制台输出。我正在使用调试器(第一次真正使用调试器)逐步执行,但它仍然没有帮助找出为什么它没有像我希望的那样读取整个内容。出于兴趣:
-debug
不会引发异常?快速浏览一下,您可能希望从输入文件中删除ODO(
发生取决于
)。您可能希望使用
EXIT-PERFORM
,而不是设置然后检查eof变量和/或将代码拆分为
部分(或仅限cobol85之前的样式段落),以提高可读性(但这更像是一个样式问题,所以请注意)。如果你能自己解决问题,请自我回答(Q&A-stye),否则请在编辑后留下一条注释。注意:我已经按照SO规则编辑了你的问题,请查看编辑。我们可以通过自动“清理”的评论进行聊天,但投票结果较高的评论除外[这些评论旨在“洞察问题/答案”]或通过讨论板进行聊天。另一个注意事项:将其作为附加问题发布是很好的,您的问题显示了研究结果,因此它们在这里是完美的匹配。我感谢您的洞察力和编辑,这些都是我可以做的,但我唯一的真正目标是有一个工作程序,它接受定义的输入,并返回定义的输出报告。基本上,在这门编程语言课上,我们被分配了小组和一个叫做“四个程序”的作业。首先,我们可以用我们想要的任何语言实现它们。然后我们必须在Fortran 66(IV)中完成,现在是Cobol。因此,我们不需要了解获得所需输出所需的算法,而需要了解如何用不同的语言实现相同的ALG,并观察您编写程序所用的语言(2)如何简化过程。哦,回答您的问题,将-debug标志添加到my launch.json并没有真正改变控制台输出。我正在使用调试器(第一次真正使用调试器)逐步完成,但它仍然没有帮助找出为什么它没有像我希望的那样读取整个内容