私はCOBOLプログラミングを学び、GNUCobol(Linux上)を使っていくつかの簡単なプログラムをコンパイルしてテストしています。これらのプログラムの1つでは、わからない予期しない動作があることがわかりました。レコードのシーケンシャルファイルを読むときは、常に1つの余分なレコードが得られます。これらのレコードをレポートに書き込むとき、最後のレコードが複製されます。GNUCobolコンパイルされたプログラムの予想数が1回多い
私はこの動作を再現するための非常に簡単なプログラムを作成しました。この場合、テキストファイルには1行のテキスト「」があります。プログラムはファイル(または1文字長いレコード)の文字をカウントする必要があり、結果として「10」と表示されると期待しますが、代わりに「11」が得られます。それらが読み込まれると、レコードを表示するとき
はまた、私は次のような出力が得られます。
0
1
2
3
4
5
6
7
8
9
11
(9と11の間に2つの空白があります)。
これは、このプログラムの関連する部分である:
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.
私は、コンパイラのデフォルトのオプションを使用している、と私は使用して試してみました「TEST WITH {BEFORE | AFTER}」が、結果はあります同じ。この動作の原因は何か、またはどのようにして期待される結果を得ることができますか?
編集:私は、ファイルを空に二つの異なる方法を使用して、0レコード数を期待して、データソースとして「空」ファイルを使用してみました:
$ echo "" > SIMPLE
この方法は、レコード数が1(LSです - lはファイルの1バイトのサイズを与える)。
$ rm SIMPLE
$ touch SIMPLE
このように、レコード数は0です(ls -lはファイルのサイズが0バイトです)。だから私は何とかコンパイルされたプログラムが余分な文字を検出していると思いますが、これを避ける方法はわかりません。
ファイルに改行文字がありますか? – ninjalj
(おそらく)11行目の行末文字を読み込んでいる可能性があります。あなたがそれを読むときにあなたがそれぞれの文字を印刷するなら、あなたは分かるかもしれません。 – geert3
注:GnuCOBOLを使用する場合は、 'PERFORM FOREVER'または' PERFORM UNTIL EXIT'を使用し、 'AT END'節で' EXIT PERFORM'を実行することをお勧めします。 –