COBOL:文件状态39错误

时间:2015-02-10 14:48:58

标签: input output cobol

这是我的cobol代码。我的cobol文件夹中有testinput.txt。我编译它并没有错误但是当我尝试运行它时,

有消息说 RCL0002:文件状态39< unopened-file>          在程序TEST的段00中的偏移0046处检测到错误

   IDENTIFICATION DIVISION. 
   PROGRAM-ID. transactionIN.


   ENVIRONMENT DIVISION. 
   CONFIGURATION SECTION. 
   SOURCE-COMPUTER. IBM-PC. 
   OBJECT-COMPUTER. IBM-PC. 
   INPUT-OUTPUT SECTION. 
   FILE-CONTROL. 
       SELECT INFILE ASSIGN TO 'testinput.txt'. 
       SELECT OUTFILE ASSIGN TO 'testoutput'. 
   DATA DIVISION. 
   FILE SECTION. 
   FD  INFILE
       LABEL RECORD IS STANDARD
       DATA RECORD IS INREC. 
   01  INREC. 
       02 AC PIC X(99). 
   FD  OUTFILE
       LABEL RECORD IS OMITTED
       DATA RECORD IS OUTREC. 
   01  OUTREC. 
       02 FILLER PIC X(80). 

   WORKING-STORAGE SECTION. 

   01  HEAD-1. 
       02 FILLER PIC X(32) VALUE SPACES. 
       02 FILLER PIC X(16) VALUE 'China Trust Bank'. 
       02 FILLER PIC X(32) VALUE SPACES. 
   01  HEAD-2. 
       02 FILLER  PIC X(34) VALUE SPACES. 
       02 FILLER  PIC X(13) VALUE 'Makati Avenue'. 
       02 FILLER PIC X(33) VALUE SPACES. 
   01  HEAD-3. 
       02 FILLER PIC X(35) VALUE SPACES. 
       02 FILLER PIC X(12) VALUE 'Makati City'. 
       02 FILLER PIC X(34) VALUE SPACES. 
   01  HEAD-4. 
       02 FILLER PIC X(33) VALUE SPACES. 
       02 FILLER PIC X(14) VALUE 'Account Report'. 
       02 FILLER PIC X(33) VALUE SPACES.
   01  SUB-1. 
       02 FILLER PIC X(20) VALUE SPACES. 
       02 FILLER PIC X(7) VALUE 'Account'. 
       02 FILLER PIC X(10) VALUE SPACES. 
       02 FILLER PIC X(7) VALUE 'Account'.
       02 FILLER PIC X(9) VALUE SPACES. 
       02 FILLER PIC X(7) VALUE 'Balance'. 
       02 FILLER PIC X(20) VALUE SPACES. 
   01  SUB-2. 
       02 FILLER PIC X(20) VALUE SPACES. 
       02 FILLER PIC X(6) VALUE 'Number'.
       02 FILLER PIC X(12) VALUE SPACES. 
       02 FILLER PIC X(4) VALUE 'Name'. 
       02 FILLER PIC X(10) VALUE SPACES.
       02 FILLER PIC X(18) VALUE SPACES. 

   SCREEN SECTION. 
   01  SCRE.  
       02 BLANK SCREEN.
   PROCEDURE DIVISION.
   MAIN-RTN.  
       PERFORM INIT-RTN THRU INIT-RTN-END. 
       PERFORM FINISH-RTN. 
       STOP RUN. 
   INIT-RTN.
       OPEN INPUT INFILE, OUTPUT OUTFILE. 
       READ INFILE AT END PERFORM END-RTN
       GO TO INIT-RTN-END. 
       PERFORM HEADING-RTN. 
   INIT-RTN-END.
   END-RTN.
       DISPLAY 'EMPTY FILE' LINE 3 COLUMN 20.
   HEADING-RTN.
       WRITE OUTREC FROM HEAD-1 AFTER PAGE. 
       WRITE OUTREC FROM HEAD-2 AFTER 1. 
       WRITE OUTREC FROM HEAD-3 AFTER 1.
       WRITE OUTREC FROM HEAD-4 AFTER 3.  
       WRITE OUTREC FROM SUB-1 AFTER 2. 
       WRITE OUTREC FROM SUB-2 AFTER 1. 
   PROCESS-RTN.
       DISPLAY SCRE. 
   FINISH-RTN.
       CLOSE INFILE, OUTFILE. 
       DISPLAY 'TAPOS NA' LINE 6 COLUMN 20. 

1 个答案:

答案 0 :(得分:4)

文件状态39表示您告诉COBOL关于该文件的内容与COBOL在尝试打开文件时发现的内容之间存在差异。

对于您在COBOL中定义的文件,数据必须精确到99个字节。如果每个记录有99个字节,后跟一个(或多个)分隔符,则需要将INREC的长度扩展为100或101个字节。

您可能想看看您的编译器(来自错误消息,似乎是CA-Realia)是否支持LINE SEQUENTIAL文件。此特定文件类型了解分隔记录,分隔符将在呈现给您的程序之前被删除。

COBOL中最简单的文件处理程序遵循以下大纲:

OPEN files
READ input until end
    process input, WRITE output
CLOSE files

该读取循环通常是以下两种形式之一:

PERFORM until some-flag-shows-end-of-file
    READ input-file
        AT END
            make end-of-file-flag show "end of file"
        NOT AT END
            do some processing
    END-READ
END-PERFORM

READ input-file ("priming read")
PERFORM until FILE STATUS field shows end-of-file
    do some processing
    READ input-file
END-PERFORM

在我看来,第二个更简单,更不容易出错。它要求在文件的SELECT上使用FILE STATUS。实际上应该始终对所有文件执行此操作,以便您可以在每个IO之后检查IO未出现意外行为。为每个文件分隔FILE STATUS字段。

这是您的计划重新安排。目前,它只读取一条记录(如果立即返回文件结尾,则只读取一条记录),但这就是您编码的记录。

PROCEDURE DIVISION.
    PERFORM INIT-RTN
    PERFORM PROCESS-FILE
    PERFORM END-RTN
    PERFORM FINISH-RTN
    STOP RUN
    . 
INIT-RTN.
    OPEN INPUT INFILE 
    check file status
    OPEN OUTPUT OUTFILE 
    check file status
    PERFORM HEADING-RTN
    . 
PROCESS-FILE.
    READ INFILE
    check file status
    . 
END-RTN.
    DISPLAY 'EMPTY FILE' LINE 3 COLUMN 20
    .
HEADING-RTN.
    WRITE OUTREC FROM HEAD-1 AFTER PAGE 
    check file status
    WRITE OUTREC FROM HEAD-2 AFTER 1
    check file status
    WRITE OUTREC FROM HEAD-3 AFTER 1
    check file status
    WRITE OUTREC FROM HEAD-4 AFTER 3  
    check file status
    WRITE OUTREC FROM SUB-1 AFTER 2 
    check file status
    WRITE OUTREC FROM SUB-2 AFTER 1 
    check file status
    .
PROCESS-RTN.
    DISPLAY SCRE
    . 
FINISH-RTN.
    CLOSE INFILE
    check file status
    CLOSE OUTFILE
    check file status
    DISPLAY 'TAPOS NA' LINE 6 COLUMN 20
    . 

因此,请检查FILE STATUS,LINE SEQUENTIAL,更改您的文件(或其程序定义)。从那里开始构建。

您可能认为报告行的文件状态检查看起来很大而且很难看。你可以这样做,而不是:

MOVE HEAD-1 TO OUTREC
PERFORM WRITE-OUTREC-AFTER-PAGE (other neater ways to do it later)

WRITE-OUTREC具有WRITE和FILE STATUS字段的测试。