COBOL记录未写入文本文件

时间:2019-01-28 05:08:40

标签: io cobol

我正在尝试制作一个简单的COBOL程序,该程序接受用户输入并将其写入.txt文件。我的程序成功创建了一个.txt文件,但是,它无法记录任何输入,对于我来说,我不知道为什么。我希望它反复接收用户输入直到指定不输入,然后将该输入写入文本文件。

这就是我所拥有的:

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
       SELECT TEST-FILE
           ASSIGN TO "C:\Users\Patrick\Desktop\TESTFILE.TXT"
           ORGANIZATION IS LINE SEQUENTIAL.

   DATA DIVISION.
   FILE SECTION.
   FD  TEST-FILE.
   01  TEST-RECORD         PIC X(25).


   WORKING-STORAGE SECTION.
   01 CONT                 PIC A(1).
   01  TEST-DETAIL.
       05  ITEM-NUMBER      PIC 9(7).
       05  FILLER           PIC X(5) VALUE SPACES.
       05  ITEM-PRICE       PIC 9(4).

   PROCEDURE DIVISION.
   PROGRAM-CONTROL.
       PERFORM OPEN-FILE.
       PERFORM GET-RECORD UNTIL CONT = 'N'.
       PERFORM CLOSE-OUT-FILE.
       STOP RUN.

   OPEN-FILE.
       OPEN OUTPUT TEST-FILE.

   GET-RECORD.
       PERFORM PROMPT-USER.
       PERFORM WRITE-RECORD.
       PERFORM CHECK-NEXT-RECORD.

   PROMPT-USER.
       DISPLAY 'ENTER PART-NUMBER'.
           ACCEPT ITEM-NUMBER.
       DISPLAY 'ENTER ITEM-PRICE'.
           ACCEPT ITEM-PRICE.

   WRITE-RECORD.
       MOVE TEST-DETAIL TO TEST-RECORD.
       WRITE TEST-RECORD.

   CHECK-NEXT-RECORD.
       DISPLAY 'ENTER ANOTHER RECORD? Y/n'.
           ACCEPT CONT.
       IF CONT = 'n' THEN MOVE 'N' TO CONT.

   CLOSE-OUT-FILE.
       CLOSE TEST-FILE.

   PERFORM PROGRAM-CONTROL.

我注意到的另一件事是,如果我将WRITE-RECORD从GET-RECORD移到PROGRAM-CONTROL,像这样

   PROGRAM-CONTROL.
       PERFORM OPEN-FILE.
       PERFORM GET-RECORD UNTIL CONT = 'N'.
       PERFORM WRITE-RECORD.
       PERFORM CLOSE-OUT-FILE.
       STOP RUN.

然后它将写入.txt文件,但是,它将仅写入最后输入的条目(这是可以预期的)。我猜这是范围的问题,但我不明白。我在哪里出错,如何进行设置,或者写呼叫是否需要成为PROGRAM-CONTROL的一部分?如果是这样,我该如何递归地仅调用PROMPT-USER,WRITE-RECORD和CHECK-NEXT-RECORD部分,使其起作用?

1 个答案:

答案 0 :(得分:5)

在程序结尾处删除PERFORM PROGRAM-CONTROL.,它应该按照您的意图进行操作。

目前,PERFORM PROGRAM-CONTROL语句是CLOSE-OUT-FILE.的最后一条语句,而不是单独的过程。这样会建立一个无限递归循环。

回答“ n”后,文件被关闭,控制权被转移到PROGRAM-CONTROL,文件被打开,然后由于CONT的值为“ N”,文件被关闭,控制权转移到PROGRAM-CONTROL,打开文件,然后由于CONT的值为'N',控制转移到PROGRAM-CONTROL,依此类推。

  
    

我要去哪里了,如何设置它才能起作用,或者WRITE调用是否需要成为PROGRAM-CONTROL的一部分?

  

您使用了不必要的语句,不,WRITE不一定是PROGRAM-CONTROL 的一部分。

  
    

如果是这样,我如何递归地仅调用PROMPT-USER,WRITE-RECORD和CHECK-NEXT-RECORD部分,使其起作用?

  

标准COBOL警告不要执行递归程序;例如,段落递归。在这种情况下,您只需要删除该一条语句即可。

在COBOL 2002中添加了递归;但是,递归被添加到标记为PROGRAM的{​​{1}}中,并包含在RECURSIVEFUNCTION中,但是对于未定义其用法的过程没有进行任何更改。


ISO / IEC 1989:2002,PERFORM声明,14.8.27.3一般规则:

  
    

11)执行以下PERFORM语句序列的结果是不确定的,并且在执行该序列时不设置任何异常条件:
    a)PERFORM语句已执行但尚未终止,则
    b)在该PERFORM语句的范围内,执行另一个PERFORM语句,然后
    c)第二条PERFORM语句的执行通过第一条PERFORM语句的退出。
    注意因为这是未定义的,所以用户应该避免这样的执行顺序。在某些实现中,它会导致堆栈溢出,在某些实现中,它会导致返回到不太可能的地方,而在其他实现上,可能会发生其他操作。因此,结果是不可预测的,不太可能移植。