【问题标题】:COBOL: File status 39 errorCOBOL:文件状态 39 错误
【发布时间】:2015-04-10 15:47:17
【问题描述】:

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

有一条消息说 RCL0002:上的文件状态 39 在程序 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. 

【问题讨论】:

  • 您为输入指定了 10 字节的固定长度记录。这就是你的数据吗?您也没有任何东西可以阻止您的程序(STOP RUNGOBACK),因此您可能会在那里崩溃,目前唯一的区别是第一次读取文件结束,而不是,是当你有数据时你会得到两组标题。查看一些示例程序。
  • 是的,我的输入文件中有 10 个字符,但我仍然收到此错误。这是我在 cobol 上的第一个程序:/ 我不知道如何解决这个问题

标签: input output cobol


【解决方案1】:

FILE STATUS 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 检查看起来又大又丑。你可以这样做,而不是:

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

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

【讨论】:

    猜你喜欢
    • 2022-03-11
    • 2021-03-23
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多