Cobol 程序直到文件末尾才会读取

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

COBOL 程序直到文件末尾才会读取。它应该逐行读取 8 个字符,后跟 72 个空字符,直到读取下一个数字。

我添加了工作存储部分、数据部分等。

问题是,它只会读取第一个数字。这是我的测试数据:

00000200                                                                        
00000200                                                                        
00000300                                                                        
00000400                                                                        
00000500                                                                        
99999999 

一旦达到99999999就应该停止

这是代码

   IDENTIFICATION DIVISION.
   PROGRAM-ID. FileProcessingProgram.

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
       SELECT INPUT-FILE ASSIGN TO 'nums.txt'.
       SELECT OUTPUT-FILE ASSIGN TO 'output.txt'.

   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 NOT LESS THAN 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.

我尝试过调整 I/O 设置及其读取文件的方式,但没有成功。

file io cobol
1个回答
0
投票

SELECT
INPUT-FILE
语句应该有
ORGANIZATION LINE SEQUENTIAL
。文本编辑器创建的任何文本文件都会在每行末尾插入这些字符。

当我添加

ORGANIZATION
子句时,程序运行完成。我还创建了一个文件来匹配默认的
SEQUENTIAL
组织。这样就完成了。

[我还删除了不必要的

INTO INPUT-VALUE-RECORD
短语。]

如最初所写,任何行分隔符都将成为下一个输入记录的一部分,从而导致数据出现问题。

另一位用户也遇到了类似的问题。这个问题也可以通过在记录描述中添加一两个额外的字符来解决行分隔符来解决。

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