COBOL чтение файла последовательной строки, количество символов

cobol

1241 просмотра

1 ответ

121 Репутация автора

в COBOL я читаю из файла последовательной строки. Строка за строкой, до EOF, что-то в этом роде

           read bank-file  at end
            move 'Y'  to end-of-bank

И строки имеют переменную длину от 40 до 80 символов. И мне нужно знать, сколько символов в каждой строке. Но строка может заканчиваться пробелами, которые мне тоже нужно считать. Поэтому я не могу взять длину строки из переменной в программе. Есть ли возвращаемое значение из оператора READ, который возвращает количество символов из прочитанной строки (пока не будет достигнут CRLF)?

Автор: Pavel Matras Источник Размещён: 19.07.2016 07:28

Ответы (1)


1 плюс

10579 Репутация автора

Решение

редактировать

Как уже упоминалось в комментариях, что на самом деле это возможно , чтобы получить количество символов (байтов) читать, действительно с RECORD VARYING DEPENDING ONпунктом:

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

    SELECT SOME-FILE
        ASSIGN TO "someFile.txt"
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.

FD SOME-FILE
    RECORD VARYING 40 TO 80 DEPENDING ON SOME-LINE-LENGTH.

 01 SOME-LINE PIC X(80).

WORKING-STORAGE SECTION.

 77 SOME-LINE-LENGTH PIC 9(3).

Теперь для каждого чтения длина записи сохраняется в SOME-LINE-LENGTH:

READ SOME-FILE NEXT RECORD
DISPLAY SOME-LINE-LENGTH

Я не знаю точно, какие поставщики поддерживают это (возможно, почти все), но по крайней мере это работает с ACUCOBOL.


Оригинальный пост

Насколько я знаю, нет отзывов о количестве байтов, прочитанных при выполнении READоператора. Видимо, байты мгновенно сохраняются в записи, описанной дескриптором файла в вашем FILE SECTION.

Однако вы можете рассчитать количество прочитанных байтов, посчитав количество символов, записанных в записи.
Сначала инициализируйте запись файла в LOW-VALUES. Затем прочитайте следующую запись; это переместит количество прочитанных байтов в запись. Когда число прочитанных байтов меньше размера записи, байты в конце записи остаются неизменными.

MOVE LOW-VALUES TO YOUR-RECORD
READ YOUR-FILE NEXT RECORD
PERFORM VARYING SOME-COUNTER FROM 72 BY -1 UNTIL (SOME-COUNTER < 0)
    IF NOT (YOUR-RECORD(SOME-COUNTER : 1) = LOW-VALUES)
        EXIT PERFORM
    END-IF
END-PERFORM

SOME-COUNTERбудет содержать длину строки, при условии, что NULв файле отсутствуют значения.

Я думаю, это займет много времени, когда количество строк велико, но, по крайней мере, вы получили длину строк.


Как уже упоминал Билл Вуджер , поскольку вы не предоставили дополнительных подробностей, мне пришлось сделать некоторые предположения.

Я использую MicroFocus ACUCOBOL-GT на Windows 10 самостоятельно.

Автор: MC Emperor Размещён: 21.07.2016 11:47
Вопросы из категории :
32x32