在 COBOL 中执行 until 循环仅读取一次,然后尽管条件仍然为假但仍会中断

Perform until loop in COBOL only reads once, then breaks out despite the condition still being false

对 COBOL 还是很陌生。我有一个简单的程序 运行s 读取一个文件,然后读取该文件的内容并将其格式化为另一个文件。我的主要问题在于事实上由于某种原因,我的模块将测试条件,发现它是假的,然后执行里面的语句。之后,它会在不改变条件的情况下重复该过程,然后终止程序。根据调试器,它甚至没有 运行 最后一个模块,200-TERM-RECORD,它只是结束。

这是程序的代码

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL 
       SELECT INVENT-FILE-IN
           ASSIGN TO "C:\TEST.TXT"
               ORGANIZATION IS LINE SEQUENTIAL.
       SELECT INVENT-REPORT-OUT
           ASSIGN TO "C:\INVREPT.TXT"
               ORGANIZATION IS LINE SEQUENTIAL. 

   data division.
   FILE SECTION. 
   FD INVENT-FILE-IN
       RECORD CONTAINS 32 CHARACTERS.
   01 INVENTORY-DATA-INPUT
       05 PART-NUMBER-INPUT PIC 9(5)
       05 PART-NAME-INPUT PIC X(20)
       05 QUANTITY-ON-HAND-INPUT PIC 9(3)
       05 UNIT-PRICE-INPUT PIC 9(4)

   FD INVENT-REPORT-OUT
       RECORD CONTAINS 77 CHARACTERS.
   01 INVENTORY-DATA-OUTPUT
       05 HEADER
           10 PRODUCT-NUMBER PIC A(6)
           10 FILLER PIC A(1)
           10 PRODUCT-NAME PIC A(8)
           10 FILLER PIC A(16)
           10 PRODUCT-QTY PIC A(3)
           10 FILLER PIC A(3)
           10 PRODUCT-VALUE PIC A(5)
           10 FILLER PIC A(3)
       05 PART-NUMBER-OUTPUT PIC 9(5)
       05 PART-NAME-OUTPUT PIC X(20)
       05 QUANTITY-ON-HAND-OUTPUT PIC 9(3)
       05 UNIT-PRICE-OUTPUT PIC 9(4)
       05 SUPPLIER-CODE-OUTPUT PIC X(5)
       05 RE-ORDER-POINT-OUTPUT PIC 9(3)
       05 RECORD-COUNTER-OUTPUT PIC 9(2)
   working-storage section.
   01 VALUES-AND-TOTALS
       05 EOF-SWITCH PIC X(1) VALUE "N"
       05 TOTAL-VALUE PIC 9(6) VALUE ZERO
       05 INVENTORY-VALUE PIC 9(6) VALUE ZERO 
       05 RECORD-COUNTER PIC 9(2) VALUE ZERO

   procedure division.
   100-CREATE-INVENTORY-RECORD.
       PERFORM 200-INIT-CREATE-INV-RECORD.
       PERFORM 200-CREATE-RECORD 
           UNTIL EOF-SWITCH = "Y".
       PERFORM 200-TERM-RECORD.



   200-INIT-CREATE-INV-RECORD.
       PERFORM 700-OPEN-INV-FILE.
       PERFORM 700-READ-FILE.

   200-CREATE-RECORD.
       PERFORM 700-WRITE-RECORD.
       PERFORM 700-READ-FILE.


   200-TERM-RECORD.
       CLOSE INVENT-FILE-IN.
       CLOSE INVENT-REPORT-OUT.

   700-OPEN-INV-FILE.
       OPEN INPUT INVENT-FILE-IN.
       OPEN OUTPUT INVENT-REPORT-OUT.

   700-READ-FILE.
       READ INVENT-FILE-IN
       AT END MOVE "Y" TO EOF-SWITCH.


   700-WRITE-RECORD.
       MOVE PART-NUMBER-INPUT TO PART-NUMBER-OUTPUT.
       MOVE PART-NAME-INPUT TO PART-NAME-OUTPUT.
       MOVE QUANTITY-ON-HAND-INPUT TO QUANTITY-ON-HAND-OUTPUT.
       MOVE UNIT-PRICE-INPUT TO UNIT-PRICE-OUTPUT.
       WRITE INVENTORY-DATA-OUTPUT.

       goback.

   end program Project2.

您的代码流(从 100-create 开始)是:

  • 200-初始化
    • 700开
    • 700 次阅读
  • 200-创建
    • 700-写入 -> 返回

不涉及循环...

一般

我建议使用 SECTION 并且只在主 SECTION 或从 prog-end SECTION 中调用 GOBACK你的主要(在特殊情况下也可能被调用)。

goback 语句从程序末尾移至第一段末尾。

700-WRITE-RECORD中,当控制到达goback语句时程序终止。您可能希望程序在 100-CREATE-INVENTORY-RECORD.

结束时终止