GNUCobol编译的程序比预期多一个记录

问题描述 投票:1回答:1

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

cobol gnucobol
1个回答
1
投票

我发现这种行为的原因是vim在保存数据文件时似乎附加的自动换行符。

以这种方式在vim中禁用它之后

:set binary
:set noeol

该程序按预期工作。

编辑:当使用从文本编辑器创建的数据文件时,一种更优雅的方法来防止此问题,在ORGANIZATION IS LINE SEQUENTIAL子句中使用SELECT

由于问题是由数据格式引起的,我应该删除这个问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.