首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COBOL85 85-文件处理

COBOL85 85-文件处理
EN

Stack Overflow用户
提问于 2014-11-03 14:43:29
回答 2查看 301关注 0票数 1

我正在读取输入文件并将其写入输出文件,直到达到EOF为止,但我的程序的问题是,在将记录写入输出文件直到EOF到达之前,输出文件比输入文件多包含一条记录,也就是说,如果输入文件包含10条记录,则输出文件包含11条记录。输出文件中的额外记录与最后一条记录相同,即最后一条记录重复两次。

所以你能告诉我我的代码有什么问题吗?

我的程序代码。

代码语言:javascript
复制
?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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-03 15:59:46

COCOL不知道您已经到达EOF,直到您尝试读取过去的最后一条记录。

因此,当您读取最后一条记录时,EOF是(没有**设置为YES,所以下一个重记录是" read“)。读取失败,EOF设置为YES -但您已经启动了循环,因此缓冲区中的数据将再次写入。

因此,您需要在EOF状态上启动您的处理。就我个人而言,我会将处理移到另一个段落,并使用

代码语言:javascript
复制
PERFORM UNTIL EOF = "YES"
READ StudentRecords
   AT END MOVE "YES" TO EOF
END-READ
IF EOF = "NO" PERFORM NEW-PARAGRAPH
END-PERFORM
票数 2
EN

Stack Overflow用户

发布于 2014-11-03 17:35:03

@Magoo是正确的。

您已经在您的FILE STATUS上对SELECT进行了编码,您可以通过使用它使事情变得更加清晰。

为了避免混淆,您应该编写两个单独的FILE STATUS字段。

在输入文件的FILE STATUS字段上,为VALUE of "10"编写一个88 (condition name)

代码语言:javascript
复制
OPEN input file, check file status is zero (another 88)
OPEN output file, check file status is zero (another 88)
Initial Processing
READ input file, check file status: if 10 (88) you have an empty file, 
     do something reasonable, else if non-zero, report it.
Loop until FILE STATUS field for input file is "10" (88)
  process input record
  Read input file
End-Loop
Final Processing check file status is zero (88)
CLOSE input file, check file status is zero (88)
All Done

这种技术,第一个READ被称为“启动读取”,防止了使用AT END/NOT AT END或立即测试AT END刚刚设置的内容的纠结。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26716515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档