Cobol file WRITE not allowed, file not open for output (status = 48) for file output-file

128 Views Asked by At

I have the following Cobol program that I am attempting to refactor it to be functional. The program is supposed to read an input file and output some stats. I am getting one major error, and one warning. I have added a bunch of my own code and it compiles.

       IDENTIFICATION DIVISION.
        PROGRAM-ID. STATMOLD.
       ENVIRONMENT DIVISION.
        INPUT-OUTPUT SECTION.
        FILE-CONTROL.
           SELECT input-file ASSIGN TO "input.dat".
           SELECT output-file ASSIGN TO "output.dat".
       DATA DIVISION.
        FILE SECTION.
        FD input-file.
         01 INPUT-VALUE-RECORD.
           02 IN-X        PIC S9(6)V9(2).
           02 FILLER      PIC X(72).
        FD output-file.
         01 output-line    PIC X(80).

        WORKING-STORAGE SECTION.
         77 SUM-OF-X-SQR   PIC 9(14)V9(2).
         77 SUM-OF-X       PIC S9(10)V9(2).
         77 N              PIC S9(4).
         77 MEAN           PIC S9(6)V9(2).
         77 I              PIC S9(4).
         01 ARRAY-AREA.
           02 X           PIC S9(6)V9(2) OCCURS 1000 TIMES.
       
         01 OUTPUT-TITLE-LINE.
           02 FILLER      PIC X(28) VALUE
                        " MEAN AND STANDARD DEVIATION".
         01 OUTPUT-UNDERLINE.
           02 FILLER      PIC X(28) VALUE
                        "----------------------------".
         01 OUTPUT-COL-HEADS.
           02 FILLER      PIC X(10) VALUE SPACES.
           02 FILLER      PIC X(11) VALUE "DATA VALUES".
         01 OUTPUT-DATA-LINE.
           02 FILLER      PIC X(10) VALUE SPACES.
           02 OUT-X       PIC -(6)9.9(2).
         01 OUTPUT-RESULTS-LINE-1.
           02 FILLER      PIC X(9) VALUE " MEAN=   ".
           02 OUT-MEAN    PIC -(6)9.9(2).
         01 OUTPUT-RESULTS-LINE-2.
           02 FILLER      PIC X(9) VALUE " STD DEV=".
           02 STD-DEVIATION    PIC -(6)9.9(2).   
           
       PROCEDURE DIVISION.
           OPEN INPUT INPUT-FILE, OUTPUT OUTPUT-FILE.
           MOVE ZERO TO IN-X.
           PERFORM PROC-BODY
             UNTIL IN-X IS = 999999.99.
           PERFORM END-OF-JOB.
       
       PROC-BODY.
           WRITE OUTPUT-LINE FROM OUTPUT-TITLE-LINE
               AFTER ADVANCING 0 LINES.
           WRITE OUTPUT-LINE FROM OUTPUT-UNDERLINE
              AFTER ADVANCING 1 LINE.
           WRITE OUTPUT-LINE FROM OUTPUT-COL-HEADS
              AFTER ADVANCING 1 LINE.
           WRITE OUTPUT-LINE FROM OUTPUT-UNDERLINE
              AFTER ADVANCING 1 LINE.
           MOVE ZERO TO SUM-OF-X.
           READ INPUT-FILE INTO INPUT-VALUE-RECORD
              AT END PERFORM END-OF-JOB.
           PERFORM INPUT-LOOP
              VARYING N FROM 1 BY 1
              UNTIL N IS GREATER THAN 1000 OR IN-X IS NOT LESS THAN 999999.98.
           SUBTRACT 1 FROM N.
           DIVIDE N INTO SUM-OF-X GIVING MEAN ROUNDED.
           MOVE ZERO TO SUM-OF-X-SQR.
           PERFORM SUM-LOOP
              VARYING I FROM 1 BY 1
              UNTIL I IS GREATER THAN N.
           COMPUTE STD-DEVIATION ROUNDED = (SUM-OF-X-SQR / N) ** 0.5.
           WRITE OUTPUT-LINE FROM OUTPUT-UNDERLINE
              AFTER ADVANCING 1 LINE.
           MOVE MEAN TO OUT-MEAN.
           WRITE OUTPUT-LINE FROM OUTPUT-RESULTS-LINE-1
              AFTER ADVANCING 1 LINE.
           WRITE OUTPUT-LINE FROM OUTPUT-RESULTS-LINE-2
              AFTER ADVANCING 1 LINE.
              
       INPUT-LOOP.
           MOVE IN-X TO X(N), OUT-X.
           WRITE OUTPUT-LINE FROM OUTPUT-DATA-LINE
              AFTER ADVANCING 1 LINE.
           ADD X(N) TO SUM-OF-X.
           READ INPUT-FILE INTO INPUT-VALUE-RECORD
              AT END PERFORM END-OF-JOB.
       
       SUM-LOOP.
           COMPUTE SUM-OF-X-SQR = SUM-OF-X-SQR + (X(I) - MEAN) ** 2.
       
       END-OF-JOB.
           CLOSE INPUT-FILE, OUTPUT-FILE.
           STOP-RUN.
       
                             

The error I am getting is:

libcob: error: WRITE not allowed, file not open for output (status = 48) for file output-file ('output_dat' => output.dat).

I believe the initialization is correct, but it's still not running to completion.

Separately, I am getting a COMPILATION warning , which says that there is move overlap at the following lines:

62 READ INPUT-FILE INTO INPUT-VALUE-RECORD

at the start of the prec body, and

87 READ INPUT-FILE INTO INPUT-VALUE-RECORD

in input-loop. I know that I can solve this with a temp variable but is there another way? and what is the solution to the WRITE not allowed error?

1

There are 1 best solutions below

3
Scott Nelson On

@jim-castro had the correct answer:

Because you had STOP-RUN (with a hyphen) instead of STOP RUN (without a hyphen), COBOL interpreted that as a paragraph name, and thus your PERFORM END-OF-JOB did not end the job, Instead, it fell through to the PROC-BODY paragraph, were it tried to write to the output file after it was closed.