COBOL 记录不写入文本文件

COBOL record not writing to text file

我正在尝试制作一个简单的 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 文件,但是,它只会写入最后输入的条目(正如预期的那样)。我猜这是范围问题,但我不明白。我哪里出错了,它可以按照我的设置工作吗,或者 WRITE 调用是否需要成为 PROGRAM-CONTROL 的一部分?如果是这样,我如何以递归方式仅调用 PROMPT-USER、WRITE-RECORD 和 CHECK-NEXT-RECORD 部分使其工作?

删除程序末尾的 PERFORM PROGRAM-CONTROL.,它应该会按照您的预期运行。

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

回答'n'后,文件关闭,控制权转移到PROGRAM-CONTROL,文件打开,然后因为CONT的值为'N',文件关闭,控制权转移到 PROGRAM-CONTROL,文件打开,然后因为 CONT 的值为 'N',控制权转移到 PROGRAM-CONTROL,依此类推.

Where am I going wrong, and can it work how I have it set up, or does the WRITE call need to be part of the PROGRAM-CONTROL?

您使用了不必要的语句,不,WRITE 不需要 成为 PROGRAM-CONTROL.

的一部分

If so, how do I recursively call only the PROMPT-USER, WRITE-RECORD and CHECK-NEXT-RECORD portions so it works?

标准 COBOL 警告不要使用递归过程;例如,段落递归。在这种情况下,您只需要删除那一条语句。

在 COBOL 2002 中添加了递归;然而,递归被添加到标记为 RECURSIVEPROGRAMs 中,并包含在 FUNCTIONs 和 METHODs 中,但没有对过程进行任何更改,其用途未定义.


ISO/IEC1989:2002,PERFORM 语句,14.8.27.3 一般规则:

11) The results of executing the following sequence of PERFORM statements are undefined and no exception condition is set to exist when the sequence is executed:
a) a PERFORM statement is executed and has not yet terminated, then
b) within the range of that PERFORM statement another PERFORM statement is executed, then
c) the execution of the second PERFORM statement passes through the exit of the first PERFORM statement.
NOTE Because this is undefined, the user should avoid such an execution sequence. On some implementations it causes stack overflows, on some it causes returns to unlikely places, and on others other actions can occur. Therefore, the results are unpredictable and are unlikely to be portable.