COBOL: estado do ficheiro 39 erro

Aqui está o meu código cobol. tenho a taxa de teste.txt na minha pasta cobol. Compilei-o e não tem erros, mas quando tento executá-lo,

Há uma mensagem que diz: RCL0002: estado do ficheiro 39 no < ficheiro fechado > Erro detectado na posição 0046 no segmento 00 do teste do programa

   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. 
Author: xzbxxzxzmn, 2015-02-10

1 answers

O estado do ficheiro 39 significa que há uma diferença entre o que disse ao COBOL sobre o ficheiro e o que o COBOL descobriu ao tentar abri-lo.

Para o ficheiro que definiu em COBOL, os dados devem ter exactamente 99 bytes de comprimento. Se você tem 99 bytes por registro, seguido por um (ou mais) delimitadores, então você precisa estender o comprimento de INREC para 100 ou 101 bytes.

Você pode querer ver se o seu compilador (a partir da mensagem de erro parece ser CA-Realia) suporta ficheiros LINE SEQUENTIAL. Este tipo de arquivo em particular compreende registros delimitados, e os delimitadores serão removidos antes de serem apresentados ao seu programa.

O programa de processamento de Ficheiros mais simples em COBOL segue este esquema:

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

Esse ciclo de leitura será tipicamente uma de duas formas:

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

O segundo é, para mim, muito mais simples e menos propenso a erros. Ele requer que o estado do arquivo é usado na seleção para o arquivo. Isto deve ser sempre feito para todos arquivos para que você possa verificar depois de cada IO que o IO não se comportou inesperadamente. Separe o campo de Estado do ficheiro para cada ficheiro.

Aqui está o teu programa re-arranjado. No momento, ele só lê um registro (ou nenhum se o fim de arquivo é devolvido imediatamente), mas isso é o que você codificou.
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
    . 

Então, verifique o estado do ficheiro, sequencial da linha, altere o seu ficheiro (ou definição do programa dele). Construa a partir daí.

Você pode pensar que a verificação do Estado do Ficheiro das linhas de relatório irá parecer grande e feio. Você pode fazê - los assim, em vez disso:

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

Onde o WRITE-OUTREC tem a escrita e o teste do campo de Estado do ficheiro.

 3
Author: Bill Woodger, 2015-02-10 18:43:11