2017-12-17 26 views
1

私は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バイトです)。だから私は何とかコンパイルされたプログラムが余分な文字を検出していると思いますが、これを避ける方法はわかりません。

+0

ファイルに改行文字がありますか? – ninjalj

+1

(おそらく)11行目の行末文字を読み込んでいる可能性があります。あなたがそれを読むときにあなたがそれぞれの文字を印刷するなら、あなたは分かるかもしれません。 – geert3

+0

注:GnuCOBOLを使用する場合は、 'PERFORM FOREVER'または' PERFORM UNTIL EXIT'を使用し、 'AT END'節で' EXIT PERFORM'を実行することをお勧めします。 –

答えて

1

この動作の原因は、vimがデータファイルを保存するときに追加するように見える自動改行文字であることがわかりました。期待通りのプログラムが動作する

:set binary 
:set noeol 

vimの中で、このように、これを無効にした後

編集:SELECT句でORGANIZATION IS LINE SEQUENTIALを使用している、テキストエディタから作成したデータファイルで作業する場合、この問題を防止する Aよりエレガントな方法。

この問題はデータフォーマットによって発生しているので、この質問を削除する必要がありますか?

+1

この問題は、同じ問題が発生した将来の訪問者を助けるかもしれないので、この質問を削除しないでください。 – rightfold

関連する問題