我正在学习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}'但结果是一样的。可能是这种行为的原因是什么,或者我如何才能得到预期的结果?
编辑:我尝试使用"空" file作为数据源,期望0记录计数,使用两种不同的方法清空文件:
$ echo "" > SIMPLE
这样记录计数为1(ls -l给出文件大小为1个字节)。
$ rm SIMPLE
$ touch SIMPLE
这样记录计数为0(ls -l给出文件的0字节大小)。所以我猜不知道编译后的程序会检测到一个额外的角色,但我不知道如何避免这种情况。
答案 0 :(得分:1)
我发现这种行为的原因是vim在保存数据文件时似乎附加的自动换行符。
以这种方式禁用此功能
:set binary
:set noeol
程序按预期工作。
编辑:在处理从文本编辑器创建的数据文件时,一种更优雅的方法可以防止此问题,在ORGANIZATION IS LINE SEQUENTIAL
子句中使用SELECT
。
由于问题是由数据格式引起的,我应该删除这个问题吗?