我正在学习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 { the |AFTER}‘,但结果是相同的。导致这种行为的原因是什么,或者我如何才能获得预期的结果?
编辑:我尝试使用一个“空”文件作为数据源,期望记录计数为0,使用两种不同的方法清空文件:
$ echo "" > SIMPLE这样,记录计数为1 (ls -l给出的文件大小为1字节)。
$ rm SIMPLE
$ touch SIMPLE这样,记录计数为0 (ls -l给出的文件大小为0字节)。所以我猜,不知何故,编译的程序正在检测一个额外的字符,但我不知道如何避免这种情况。
发布于 2017-12-18 03:28:58
我发现这种行为的原因是vim在保存数据文件时似乎会自动添加换行符。
以这种方式在vim中禁用此功能后
:set binary
:set noeol该程序按预期运行。
编辑:当使用从文本编辑器创建的数据文件时,一种更优雅的方法是在SELECT子句中使用ORGANIZATION IS LINE SEQUENTIAL。
既然问题是由数据格式引起的,我应该删除这个问题吗?
https://stackoverflow.com/questions/47854787
复制相似问题