1

入力ファイルを読み取って、EOFに達するまで出力ファイルに書き込んでいますが、プログラムの問題は、EOFに達するまで出力ファイルにレコードを書き込んだ後、出力ファイルに入力ファイルと比較して1つの余分なレコードが含まれていることです。入力ファイルに 10 レコードが含まれる場合、出力ファイルには 11 レコードが含まれます。また、出力ファイルの余分なレコードは最後のレコードと同じです。つまり、最後のレコードが 2 回繰り返されます。

私のコードの問題点を教えてください。

私のプログラムコード。

?SYMBOLS
?INSPECT

 IDENTIFICATION DIVISION.
 PROGRAM-ID. InsertRecords.
 AUTHOR. XYZ.


 ENVIRONMENT DIVISION.
 INPUT-OUTPUT SECTION.
 FILE-CONTROL.
      SELECT StudentRecords
             ASSIGN TO "=MKFIL1"
             ORGANIZATION IS SEQUENTIAL
             ACCESS       IS SEQUENTIAL
             FILE STATUS IS WS-FILE-STATUS.

      SELECT NEWStudentRecords
             ASSIGN TO "=MKFIL2"
             ORGANIZATION IS SEQUENTIAL
             ACCESS       IS SEQUENTIAL
             FILE STATUS IS WS-FILE-STATUS.

 DATA DIVISION.
 FILE SECTION.
 FD StudentRecords.
 01 StudentRecord.
   05 Student              PIC X(431).


 FD NewStudentRecords.
 01 NewStudentRecord        PIC X(431).


 WORKING-STORAGE SECTION.

 01 WS-DETAIL-RECORD          PIC X(431).

 01  EOF                      PIC X(3)  VALUE  "NO".

 01 WS-FILE-STATUS            PIC XX VALUE ZEROES.

 01 WS-SOURCE.
   05 PIC X(16) VALUE X"000102030405060708090A0B0C0D0E0F".
   05 PIC X(16) VALUE X"101112131415161718191A1B1C1D1E1F".
   05 PIC X(16) VALUE X"202122232425262728292A2B2C2D2E2F".
   05 PIC X(16) VALUE X"303132333435363738393A3B3C3D3E3F".
   05 PIC X(16) VALUE X"404142434445464748494A4B4C4D4E4F".
   05 PIC X(16) VALUE X"505152535455565758595A5B5C5D5E5F".
   05 PIC X(16) VALUE X"606162636465666768696A6B6C6D6E6F".
   05 PIC X(16) VALUE X"707172737475767778797A7B7C7D7E7F".
   05 PIC X(16) VALUE X"808182838485868788898A8B8C8D8E8F".
   05 PIC X(16) VALUE X"909192939495969798999A9B9C9D9E9F".
   05 PIC X(16) VALUE X"A0A1A2A3A4A5A6A7A8A9AAABACADAEAF".
   05 PIC X(16) VALUE X"B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF".
   05 PIC X(16) VALUE X"C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF".
   05 PIC X(16) VALUE X"D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF".
   05 PIC X(16) VALUE X"E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF".
   05 PIC X(16) VALUE X"F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF".

 01 WS-TARGET.
   05 PIC X(16) VALUE X"20202020202020202020202020202020".
   05 PIC X(16) VALUE X"20202020202020202020202020202020".
   05 PIC X(16) VALUE X"202122232425262728292A2B2C2D2E2F".
   05 PIC X(16) VALUE X"303132333435363738393A3B3C3D3E3F".
   05 PIC X(16) VALUE X"404142434445464748494A4B4C4D4E4F".
   05 PIC X(16) VALUE X"505152535455565758595A5B5C5D5E5F".
   05 PIC X(16) VALUE X"606162636465666768696A6B6C6D6E6F".
   05 PIC X(16) VALUE X"707172737475767778797A7B7C7D7E20".
   05 PIC X(16) VALUE X"20202020202020202020202020202020".
   05 PIC X(16) VALUE X"20202020202020202020202020202020".
   05 PIC X(16) VALUE X"20202020202020202020202020202020".
   05 PIC X(16) VALUE X"20202020202020202020202020202020".
   05 PIC X(16) VALUE X"20202020202020202020202020202020".
   05 PIC X(16) VALUE X"20202020202020202020202020202020".
   05 PIC X(16) VALUE X"20202020202020202020202020202020".
   05 PIC X(16) VALUE X"20202020202020202020202020202020".


 PROCEDURE DIVISION.
 BEGIN.
    OPEN INPUT StudentRecords
    OPEN OUTPUT NewStudentRecords

    PERFORM UNTIL EOF = "YES"
    READ StudentRecords
       AT END MOVE "YES" TO EOF
    END-READ
          MOVE Student TO WS-DETAIL-RECORD
          INSPECT WS-DETAIL-RECORD CONVERTING WS-SOURCE TO WS-TARGET
              WRITE NewStudentRecord FROM WS-DETAIL-RECORD
    END-PERFORM
    CLOSE StudentRecords
    CLOSE NewStudentRecords
    STOP RUN.
4

2 に答える 2

2

COCOLは、最後のレコードを超えて読み取ろうとするまで、EOF に到達したことを知りません。

したがって、最後のレコードを読み取ると、EOFis ((not** に設定されてYESいるため、次の reocrd は「読み取り」になります。その読み取りは失敗し、 -EOFに設定されYESますが、既にループを開始しているため、バッファー内のデータは再び書かれました。

したがって、EOFステータスで処理をゲートする必要があります。個人的には、処理を別の段落に移動して使用します

PERFORM UNTIL EOF = "YES"
READ StudentRecords
   AT END MOVE "YES" TO EOF
END-READ
IF EOF = "NO" PERFORM NEW-PARAGRAPH
END-PERFORM
于 2014-11-03T15:59:46.307 に答える