Io COBOL记录未写入文本文件

Io COBOL记录未写入文本文件,io,cobol,Io,Cobol,我正在尝试制作一个简单的COBOL程序,它接受用户输入并将其写入.txt文件。我的程序成功地创建了一个.txt文件,但是,它无法记录任何输入,而且我一辈子都不知道为什么。我希望它重复地接受用户输入,直到指定不接受为止,并将该输入写入文本文件 这就是我所拥有的: ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT TEST-FILE ASSIGN TO "C:\Use

我正在尝试制作一个简单的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文件,然而,它只会像预期的那样写入最后输入的条目。我猜这是一个范围问题,但我不明白。我哪里出错了,它能工作吗?我是如何设置的,还是写调用需要成为程序控制的一部分?如果是这样,我如何递归地只调用PROMPT-USER、WRITE-RECORD和CHECK-NEXT-RECORD部分使其工作?

Delete-PERFORM-PROGRAM-CONTROL。在课程结束时,它应该做你想要做的事情

如目前所述,执行程序控制语句是关闭文件的最后一个语句,而不是单独的过程。这将建立一个无限递归循环

回答“n”后,文件关闭,控制转移到程控,文件打开,然后因为CONT的值为“n”,文件关闭,控制转移到程控,文件打开,然后因为CONT的值为“n”,控制转移到程控,依此类推

我哪里出错了,它能工作吗?我是如何设置的,还是写调用需要成为程序控制的一部分

您使用了一个不必要的语句,并且,不,WRITE不需要成为程序控制的一部分

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

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

COBOL2002中增加了递归;然而,递归被添加到标记为递归的程序中,并包含在函数和方法中,但没有对过程进行任何更改,因为过程的使用尚未定义

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

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

删除执行程序控制。在课程结束时,它应该做你想要做的事情

如目前所述,执行程序控制语句是关闭文件的最后一个语句,而不是单独的过程。这将建立一个无限递归循环

回答“n”后,文件关闭,控制转移到程控,文件打开,然后因为CONT的值为“n”,文件关闭,控制转移到程控,文件打开,然后因为CONT的值为“n”,控制转移到程控,依此类推

我哪里出错了,它能工作吗?我是如何设置的,还是写调用需要成为程序控制的一部分

您使用了一个不必要的语句,并且,不,WRITE不需要成为程序控制的一部分

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

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

COBOL2002中增加了递归;然而,递归被添加到标记为递归的程序中,并包含在函数和方法中,但没有对过程进行任何更改,因为过程的使用尚未定义

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

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


您需要附加到文件,而不是覆盖它。您不需要执行程序控制。在你的节目结束时。由于程序控制是程序部门的第一段,因此将执行该段。鉴于我在这里看到的代码,我不确定这将如何发生,但如果您再次执行程序控制,这可能是您观察到的行为的原因。@DavidGorsline您的答案是正确的请参阅下面Rick的完整解释-请在下一次发布答案,因为答案是不可能的,除了注释。您需要附加到文件中,不覆盖它。您不需要执行程序控制。在你的节目结束时。由于程序控制是程序部门的第一段,因此将执行该段。考虑到我在这里看到的代码,我不确定这将如何发生,但如果您第二次执行程序控制,这可能会解释您观察到的行为。@DavidGorsline您的答案是正确的请参阅下面Rick的完整解释-请在下一次发布答案,因为答案是不可能的,除了注释。