我正在学习 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 个字节的大小)。所以我猜想编译的程序以某种方式检测到一个额外的字符,但我不知道如何避免这种情况。