Запись на COBOL не записывается в текстовый файл - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь создать простую программу на языке COBOL, которая принимает пользовательские данные и записывает их в текстовый файл.Моя программа успешно создает файл .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, чтобы они работали?

1 Ответ

0 голосов
/ 28 января 2019

Удалите 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 s, помеченным как RECURSIVE и включена для FUNCTION s и METHOD s, но не было сделано никаких изменений для процедур, где ее использование не определено.


ISO / IEC 1989: 2002, оператор PERFORM, 14.8.27.3 Общие правила:

11) Результаты выполнения следующей последовательности операторов PERFORM не определены, и условие исключения не заданосуществовать при выполнении последовательности:
a) оператор PERFORM выполняется и еще не завершен, затем
b) в пределах диапазона этого оператора PERFORM выполняется другой оператор PERFORM, затем
c)выполнение второго оператора PERFORM проходит через выход первого оператора PERFORM.
ПРИМЕЧАНИЕ Поскольку это не определено, пользователь должен избегать такой последовательности выполнения.В некоторых реализациях это вызывает переполнение стека, в некоторых это вызывает возврат в маловероятные места, а в других могут происходить другие действия.Поэтому результаты непредсказуемы и вряд ли будут переносимыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...