不允许 Cobol 文件写入,文件未打开以进行输出(状态 = 48)文件输出文件

问题描述 投票:0回答:1

我有以下 Cobol 程序,我正在尝试重构它以使其正常工作。该程序应该读取输入文件并输出一些统计信息。我收到一个重大错误和一个警告。我添加了一堆我自己的代码并且它可以编译。

       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.
       
                             

我收到的错误是:

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

我相信初始化是正确的,但它仍然没有运行完成。

另外,我收到一条编译警告,它表示以下几行存在移动重叠:

62 READ INPUT-FILE INTO INPUT-VALUE-RECORD

在前体的开始处,并且

87 READ INPUT-FILE INTO INPUT-VALUE-RECORD

在输入循环中。我知道我可以用临时变量解决这个问题,但是还有其他方法吗? WRITE not allowed 错误的解决方案是什么?

io cobol
1个回答
0
投票

@jim-castro 有正确答案:

因为你有

STOP-RUN
(带连字符)而不是
STOP RUN
(不带连字符),COBOL 将其解释为段落名称,因此你的
PERFORM END-OF-JOB
并没有结束工作,相反,它落到了
PROC-BODY
段落,关闭后是否尝试写入输出文件。

© www.soinside.com 2019 - 2024. All rights reserved.