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 设置及其读取文件的方式,但没有成功。
SELECT
的 INPUT-FILE
语句应该有 ORGANIZATION LINE SEQUENTIAL
。文本编辑器创建的任何文本文件都会在每行末尾插入这些字符。
当我添加
ORGANIZATION
子句时,程序运行完成。我还创建了一个文件来匹配默认的 SEQUENTIAL
组织。这样就完成了。
[我还删除了不必要的
INTO INPUT-VALUE-RECORD
短语。]
如最初所写,任何行分隔符都将成为下一个输入记录的一部分,从而导致数据出现问题。
另一位用户也遇到了类似的问题。这个问题也可以通过在记录描述中添加一两个额外的字符来解决行分隔符来解决。