首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COBOL:文件状态39错误

COBOL:文件状态39错误
EN

Stack Overflow用户
提问于 2015-02-10 22:48:58
回答 1查看 13.3K关注 0票数 2

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

有一条消息显示RCL0002:在程序测试的段00的偏移量0046处检测到文件状态39

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

回答 1

Stack Overflow用户

发布于 2015-02-11 02:43:12

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

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

您可能想看看您的编译器(从错误消息看,它似乎是CA-Realia)是否支持LINE SEQUENTIAL文件。这种特定的文件类型可以识别分隔的记录,并且分隔符将在呈现给您的程序之前被剥离。

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

代码语言:javascript
复制
OPEN files
READ input until end
    process input, WRITE output
CLOSE files

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

代码语言:javascript
复制
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上使用文件状态。实际上,应该始终对所有文件执行此操作,以便您可以在每次IO之后检查IO是否没有意外行为。每个文件的单独文件状态字段。

这是你重新编排的节目。目前,它只读取一条记录(如果立即返回文件结束,则不读取),但这是您编写的代码。

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

因此,检查文件状态、行顺序,更改文件(或文件的程序定义)。从那里开始构建。

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

代码语言:javascript
复制
MOVE HEAD-1 TO OUTREC
PERFORM WRITE-OUTREC-AFTER-PAGE (other neater ways to do it later)

其中WRITE-OUTREC包含文件状态字段的写入和测试。

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

https://stackoverflow.com/questions/28434594

复制
相关文章

相似问题

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