从.DAT文件读取记录返回空值,COBOL文件操作问题求助
COBOL读取DAT文件空白问题排查与修复方案
问题
作为COBOL新手,尝试读取格式为每行一条数据("ELF #"开头的行代表新记录)的.DAT文件,但自行编写的代码运行后仅显示空白,需排查文件操作错误并修复。
文件内容样本
ELF-CAL 6669 6434 6564 1032 1098 1829 2608 7322 2690 7061 1664 5769 ELF #16160 1082 3958 5272 2188 5618 3418 2302 2926 3338 1082 2024 4195 4083 ELF #13276 5581 3421 3403 4356 2989 1278 1868 3630 4702 3409 4887 2383 ELF #17104 7496 5265 8078 8788 7402 3601 2641 1252 4994 ELF #14074 7524 8889 9290 8892 5785 2163 1074 6747 ELF #17452 8006 12427 7919 4012 6850 ELF #134591 26861 ELF #113028 12695 12762 11006 15937 ELF #117218 12408 17554 11415 ELF #11118 7240 6400 3431 1032 3283 4667 6100 5076 1101 6952 3527 ELF #17633 4385 4510 4073 3052 11738 ELF #133554 ELF #13448 16054 10839 ELF #14496 2697 4731 5150 5327 4039 4004 2148 6150 4001 2882 5780 4327 ELF #14095 2064 6701 3828 2427 4775 2583 2000 1390 7391 1701 3796 ELF #110355 1262 8781 6350 ELF #111053 11527 1389 6007 12383 11033 ELF #17951 4258 9815 10061 7579 3769 11431 ELF #13597 35622 ELF #12129 2994 4260 5269 4179 1612 3509 3581 4544 3713 3202 6458 1203 1095 ELF #117196 13475 12666 ELF #13549 6432 6593 6723 1272 4023 2112 2844 5135 5103 1585 4773 5635 ELF #18731 16378 5076 2999 ELF #111136 1525 8684 9731 9753 5366 7399 ELF #18996 1483 4922 1191 2761 (It goes on and on. Each occurence of "ELF #" Is supposed to indicate a new record)
原错误代码
IDENTIFICATION DIVISION. PROGRAM-ID. COBSHL03. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT ELF-INNPUT ASSIGN TO "C:\Users\dsdsd\Desktop\innput.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS DOING-ITS-BEST. DATA DIVISION. FILE SECTION. FD ELF-INNPUT. 01 ELF-RECS. 05 ELF-CAL PIC X(9). 05 ELF-NUM PIC X(10). WORKING-STORAGE SECTION. 01 CACLULATIONS. 03 COUNT-OF-ELF PIC X(6). 03 ELF-CAL-TOTAL PIC 9(6). 01 DOING-ITS-BEST PIC X(900). PROCEDURE DIVISION. PROGRAM-BEGIN. OPEN INPUT ELF-INNPUT. DISPLAY ELF-RECS. CLOSE ELF-INNPUT. PROGRAM-DONE. STOP RUN.
错误分析
- 未执行读取操作:打开文件后直接
DISPLAY ELF-RECS,但从未执行READ语句将文件数据加载到记录变量中,所以显示空白。 - 记录结构定义错误:文件为每行一条文本数据,而原代码将记录定义为固定长度的
X(9)+X(10)组合,完全不符合实际行式文本的结构。 - 文件状态变量违规:COBOL要求
FILE STATUS变量必须是2位字符型(PIC XX),原代码定义为X(900),无法正确获取文件操作状态,也会导致潜在的文件操作异常。 - 无循环读取逻辑:文件包含多条记录,原代码仅执行一次操作,即使修复读取也只能处理单条记录。
- 变量名拼写错误:如
ELF-INNPUT(应为ELF-INPUT)、CACLULATIONS(应为CALCULATIONS),虽不致命但不符合编码规范。
修复方案
- 修正文件状态变量为标准的2位字符型。
- 将记录定义为适配行式文本的固定长度字符型(如
PIC X(20),覆盖样本中最长行长度)。 - 添加循环读取逻辑,逐行读取文件直到结束。
- 识别"ELF #"开头的行作为新记录标记,计算每个ELF的卡路里总和。
- 修正拼写错误,规范变量命名。
修复后代码
IDENTIFICATION DIVISION. PROGRAM-ID. COBSHL03. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT ELF-INPUT ASSIGN TO "C:\Users\dsdsd\Desktop\innput.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-FILE-STATUS. DATA DIVISION. FILE SECTION. FD ELF-INPUT. 01 ELF-RECORD PIC X(20). // 适配文件中最长行的长度 WORKING-STORAGE SECTION. 01 WS-CALCULATIONS. 03 WS-ELF-COUNT PIC 9(3) VALUE 0. 03 WS-CURRENT-TOTAL PIC 9(7) VALUE 0. // 足够存储总和 03 WS-MAX-TOTAL PIC 9(7) VALUE 0. 03 WS-CURRENT-ELF-ID PIC X(10). 01 WS-FILE-STATUS PIC XX. 01 WS-EOF-FLAG PIC X(1) VALUE 'N'. 88 END-OF-FILE VALUE 'Y'. PROCEDURE DIVISION. MAIN-LOGIC. OPEN INPUT ELF-INPUT. IF WS-FILE-STATUS NOT = '00' DISPLAY "文件打开失败,状态码: " WS-FILE-STATUS GO TO END-PROGRAM END-IF. PERFORM READ-UNTIL-EOF UNTIL END-OF-FILE. // 输出最后一个ELF的总和 IF WS-ELF-COUNT > 0 DISPLAY "ELF " WS-CURRENT-ELF-ID " 卡路里总和: " WS-CURRENT-TOTAL IF WS-CURRENT-TOTAL > WS-MAX-TOTAL MOVE WS-CURRENT-TOTAL TO WS-MAX-TOTAL END-IF END-IF. DISPLAY "处理完成,共统计 " WS-ELF-COUNT " 个ELF". DISPLAY "最大卡路里总和: " WS-MAX-TOTAL. END-PROGRAM. CLOSE ELF-INPUT. STOP RUN. READ-UNTIL-EOF. READ ELF-INPUT AT END SET END-OF-FILE TO TRUE NOT AT END PERFORM PROCESS-RECORD END-READ. PROCESS-RECORD. // 检查是否为新ELF记录 IF ELF-RECORD(1:5) = "ELF #" // 先输出上一个ELF的总和(如果不是第一个) IF WS-ELF-COUNT > 0 DISPLAY "ELF " WS-CURRENT-ELF-ID " 卡路里总和: " WS-CURRENT-TOTAL // 更新最大值 IF WS-CURRENT-TOTAL > WS-MAX-TOTAL MOVE WS-CURRENT-TOTAL TO WS-MAX-TOTAL END-IF END-IF // 重置当前总和,记录新ELF ID ADD 1 TO WS-ELF-COUNT MOVE ZEROS TO WS-CURRENT-TOTAL MOVE ELF-RECORD(6:10) TO WS-CURRENT-ELF-ID // 获取ELF编号 ELSE // 累加卡路里值(跳过首行的ELF-CAL) IF ELF-RECORD NOT = "ELF-CAL" COMPUTE WS-CURRENT-TOTAL = WS-CURRENT-TOTAL + FUNCTION NUMVAL(ELF-RECORD) END-IF END-IF.
内容的提问来源于stack exchange,提问作者the cool
相关产品推荐
相关产品推荐

