Скомпилированная программа 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
пункт.
Так как проблема была вызвана форматом данных, я должен удалить этот вопрос?