1

I'm learning COBOL programming and using GNUCobol (on Linux) to compile and test some simple programs. In one of those programs I have found an unexpected behavior that I don't understand: when reading a sequential file of records, I'm always getting one extra record and, when writing these records to a report, the last record is duplicated.

I have made a very simple program to reproduce this behavior. In this case, I have a text file with a single line of text: "0123456789". The program should count the characters in the file (or 1 chararacter long records) and I expect it to display "10" as a result, but instead I get "11".

Also, when displaying the records, as they are read, I get the following output:

0
1
2
3
4
5
6
7
8
9


11

(There are two blank spaces between 9 and 11).

This is the relevant part of this program:

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.

I'm using the default options for the compiler, and I have tried using 'WITH TEST {BEFORE|AFTER}' but the result is the same. What can be the cause of this behavior or how can I get the expected result?

Edit: I tried using an "empty" file as data source, expecting a 0 record count, using two different methods to empty the file:

$ echo "" > SIMPLE

This way the record count is 1 (ls -l gives a size of 1 byte for the file).

$ rm SIMPLE
$ touch SIMPLE

This way the record count is 0 (ls -l gives a size of 0 bytes for the file). So I guess that somehow the compiled program is detecting an extra character, but I don't know how to avoid this.

jantoniomartin
  • 215
  • 3
  • 9

1 Answers1

1

I found out that the cause of this behavior is the automatic newline character that vim seems to append when saving the data file.

After disabling this in vim this way

:set binary
:set noeol

the program works as expected.

Edit: A more elegant way to prevent this problem, when working with data files created from a text editor, is using ORGANIZATION IS LINE SEQUENTIAL in the SELECT clause.

Since the problem was caused by the data format, should I delete this question?

jantoniomartin
  • 215
  • 3
  • 9
  • 1
    You should not delete this question, because it may help future visitors that encounter the same problem. –  Dec 25 '17 at 11:45