Скомпилированная программа GNUCobol считает на одну запись больше, чем ожидалось

Я изучаю программирование на языке COBOL и использую GNUCobol (в Linux) для компиляции и тестирования некоторых простых программ. В одной из этих программ я обнаружил неожиданное поведение, которого я не понимаю: при чтении последовательного файла записей я всегда получаю одну дополнительную запись, а при записи этих записей в отчет последняя запись дублируется.

Я сделал очень простую программу для воспроизведения этого поведения. В этом случае у меня есть текстовый файл с одной строкой текста: "0123456789". Программа должна считать символы в файле (или 1 длинную запись символа), и я ожидаю, что в результате будет отображаться "10", но вместо этого я получаю "11".

Кроме того, при отображении записей, как они читаются, я получаю следующий вывод:

0
1
2
3
4
5
6
7
8
9


11

(Есть два пробела между 9 и 11).

Это соответствующая часть этой программы:

FD SIMPLE.
01 SIMPLE-RECORD.
    05 SMP-NUMBER PIC 9(1).

[...]
PROCEDURE DIVISION.

000-COUNT-RECORDS.
    OPEN INPUT SIMPLE.
    PERFORM UNTIL SIMPLE-EOF
        READ SIMPLE
            AT END
                SET SIMPLE-EOF TO TRUE
            NOT AT END
                DISPLAY SMP-NUMBER
                ADD 1 TO RECORD-COUNT
        END-READ
    END-PERFORM

    DISPLAY RECORD-COUNT.
    CLOSE SIMPLE.
    STOP RUN.

Я использую параметры по умолчанию для компилятора, и я попытался использовать 'WITH TEST {BEFORE|AFTER}', но результат тот же. Что может быть причиной такого поведения или как я могу получить ожидаемый результат?

Редактировать: я пытался использовать "пустой" файл в качестве источника данных, ожидая 0 записей, используя два разных метода для очистки файла:

$ echo "" > SIMPLE

Таким образом, количество записей равно 1 (ls -l дает размер файла в 1 байт).

$ rm SIMPLE
$ touch SIMPLE

Таким образом, количество записей равно 0 (ls -l дает размер файла 0 байт). Поэтому я предполагаю, что каким-то образом скомпилированная программа обнаруживает дополнительный символ, но я не знаю, как этого избежать.

1 ответ

Я обнаружил, что причиной такого поведения является автоматический символ новой строки, который vim, кажется, добавляет при сохранении файла данных.

После отключения этого в Vim таким образом

:set binary
:set noeol

программа работает как положено.

Изменить: более элегантный способ предотвратить эту проблему при работе с файлами данных, созданными из текстового редактора, использует ORGANIZATION IS LINE SEQUENTIAL в SELECT пункт.

Так как проблема была вызвана форматом данных, я должен удалить этот вопрос?

Другие вопросы по тегам