user23756814
user23756814

Reputation: 29

Cobol program wont read until end of file

COBOL program wont read until end of file. It should read line by line, 8 character number followed by 72 empty charctacters till it reads in next number.

I've added the WORKING-STORAGE SECTION, DATA DIVISION, etc.

Issue is, it'll only read the first number in. This is my test data:

00000200                                                                        
00000200                                                                        
00000300                                                                        
00000400                                                                        
00000500                                                                        
99999999 

It should stop once it hits 99999999

Here is the code

   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've tried to adjust the I/O setting, and the way it reads in the file, but no luck.

Upvotes: 1

Views: 182

Answers (1)

Rick Smith
Rick Smith

Reputation: 4407

The SELECT statement for INPUT-FILE should have ORGANIZATION LINE SEQUENTIAL. Any text file created by a text editor will insert those characters at the end of each line.

When I added the ORGANIZATION clause, the program ran to completion. I also created a file to match the default SEQUENTIAL organization. That ran to completion.

[I also removed the unnecessary INTO INPUT-VALUE-RECORD phrases.]

As originally written, any line separators will become part of the next input record causing problems with the data.

Another user had a similar problem. This problem could also be solved by adding one or two extra characters to the record description to account for the line separators.

Upvotes: 3

Related Questions