Чтение STDIN (SYSIN) в COBOL

Я хочу прочитать строки из STDIN (также известного как SYSIN) в COBOL. А пока я просто хочу распечатать их, чтобы знать, что они у меня есть. Из всего, что я читаю, похоже, что это должно работать:

IDENTIFICATION DIVISION.
PROGRAM-ID. APP.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

    SELECT SYSIN ASSIGN TO DA-S-SYSIN ORGANIZATION LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.

FD SYSIN.
01 ln PIC X(255).
    88 EOF VALUE HIGH-VALUES.
WORKING-STORAGE SECTION.

PROCEDURE DIVISION.
    OPEN INPUT SYSIN
    READ SYSIN
      AT END SET EOF TO TRUE
    END-READ
    PERFORM UNTIL EOF
        DISPLAY ln
        READ SYSIN
            AT END SET EOF TO TRUE
        END-READ
    END-PERFORM
    CLOSE SYSIN
    STOP RUN.

Это компилируется (используя open-cobol и cobc -x), но запустив его, я получаю:

libcob: File does not exist (STATUS = 35) File : ''

Что я делаю не так?


person singpolyma    schedule 02.06.2009    source источник


Ответы (3)


На OpenCOBOL мне было предложено следующее. форумы.

SELECT SYSIN ASSIGN TO KEYBOARD ORGANIZATION LINE SEQUENTIAL.

Это ключевое слово KEYBOARD, которое заставляет его работать.

По-видимому, DISPLAY — это слово, похожее на STDOUT, но я не проверял это.

person singpolyma    schedule 03.06.2009

Мой COBOL восходит к мини-компьютеру DPS-6, работающему под управлением GCOS-6, и я продолжал прикасаться к нему в 1992 году. Но тогда мы использовали ACCEPT для получения ввода со стандартного ввода.

person Paul Mitchell    schedule 02.06.2009
comment
Я согласен с использованием ACCEPT вместо этого (хотя я читал, что это считается плохой практикой для больших данных), но тогда как мне построить цикл для обнаружения EOF? - person singpolyma; 02.06.2009

Вы можете просто использовать ключевое слово ACCEPT для захвата вывода с клавиатуры. Прокручивайте до тех пор, пока не нажмете ключевое слово, такое как «конец», или вы можете использовать шестнадцатеричное значение EOF (я полагаю, 1A).

As in:

1000-YOUR-PARAGRAPH.
  ACCEPT WS-YOUR-VARIABLE.
  DISPLAY WS-YOUR-VARIABLE.
  IF WS-YOUR-VARIABLE IS NOT EQUAL TO EOF
    THEN GO TO 1000-YOUR-PARAGRAPH
  ELSE GO TO 1090-EXIT
  END-IF.
1090-EXIT.
  EXIT.

Это приведет все к маркеру EOL (например, возврату).

person ahlatimer    schedule 12.07.2009