You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从.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),虽不致命但不符合编码规范。

修复方案

  1. 修正文件状态变量为标准的2位字符型。
  2. 将记录定义为适配行式文本的固定长度字符型(如PIC X(20),覆盖样本中最长行长度)。
  3. 添加循环读取逻辑,逐行读取文件直到结束。
  4. 识别"ELF #"开头的行作为新记录标记,计算每个ELF的卡路里总和。
  5. 修正拼写错误,规范变量命名。

修复后代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:31:17