我正在尝试制作一个简单的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.
Run Code Online (Sandbox Code Playgroud)
我注意到的另一件事是,如果我将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.
Run Code Online (Sandbox Code Playgroud)
然后它将写入.txt文件,但是,它将仅写入最后输入的条目(这是可以预期的)。我猜这是范围的问题,但我不明白。我在哪里出错,如何进行设置,或者写入呼叫需要成为程序控制的一部分?如果是这样,我该如何递归地仅调用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,依此类推。
我在哪里出错,如何进行设置,或者写入呼叫需要成为程序控制的一部分?
您使用了不必要的声明,并没有,WRITE并不需要成为团队的一分子PROGRAM-CONTROL。
如果是这样,我该如何递归地仅调用PROMPT-USER,WRITE-RECORD和CHECK-NEXT-RECORD部分,使其起作用?
标准COBOL警告不要执行递归程序;例如,段落递归。在这种情况下,您只需要删除该一条语句。
在COBOL 2002中添加了递归;但是,将递归添加到PROGRAM标记为RECURSIVE并包含在FUNCTIONs和METHODs的s中,但是未对未定义其用法的过程进行任何更改。
ISO / IEC 1989:2002,PERFORM声明,14.8.27.3通用规则:
11)执行以下PERFORM语句序列的结果是不确定的,并且在执行该序列时不设置任何异常条件:
a)执行PERFORM语句但尚未终止,然后
b)在该PERFORM范围内语句执行另一个PERFORM语句,然后
c)第二个PERFORM语句的执行通过第一个PERFORM语句的退出。
注意因为这是未定义的,所以用户应该避免这样的执行顺序。在某些实现中,它会导致堆栈溢出,在某些实现中,它会导致返回到不太可能的地方,而在其他实现上,可能会发生其他操作。因此,结果是不可预测的,不太可能移植。
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |