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

COBOL程序仅读取TXT文件一行无法循环的技术求助

问题排查与修复方案

核心问题:EOF标记逻辑完全颠倒

程序仅读取一行就终止循环,根源在于EOF变量的初始值、READ语句的AT END处理,以及PERFORM循环条件三者的逻辑完全不匹配:

错误点拆解

  • EOF初始值错误:WORKING-STORAGE中EOF初始值设为'Y'(表示已到文件尾),但程序启动时还未读取任何记录,应该初始化为'N'(未到文件尾)。
  • 第一次READ的AT END处理逻辑反了:READ FACULTY-IN AT END MOVE 'Y' TO EOF. 这句只有在读取到文件尾时才应该执行,但你的初始EOF已经是'Y',导致循环一开始就满足终止条件的反向逻辑。
  • PERFORM循环条件错误:PERFORM PRINT-RECORDS UNTIL EOF = 'N'. 循环条件是"直到EOF等于'N'才停止",但实际需求是"直到EOF等于'Y'(文件尾)才停止循环"。

修复后的代码修改点

1. 调整EOF初始值

WORKING-STORAGE SECTION.
01  EOF              PIC X   VALUE 'N'.  // 初始化为未到文件尾状态

2. 修改MAIN-RTN中的READ逻辑与循环条件

PROCEDURE DIVISION.
MAIN-RTN.
    OPEN INPUT FACULTY-IN
         OUTPUT FACULTY-OUT.
         
    PERFORM HEADERS-RTN.
    READ FACULTY-IN AT END MOVE 'Y' TO EOF.  // 读取第一条记录,到文件尾则标记EOF为'Y'
    PERFORM PRINT-RECORDS UNTIL EOF = 'Y'.  // 循环执行直到到达文件尾
    
    CLOSE FACULTY-IN, FACULTY-OUT.
    STOP RUN.

3. 修正PRINT-RECORDS中的READ处理

PRINT-RECORDS.
    WRITE OUT-REC FROM FAC-RECORDS.
    READ FACULTY-IN AT END MOVE 'Y' TO EOF.  // 读取下一条记录,到文件尾时标记EOF

额外验证:固定长度记录匹配

你定义的记录长度为19字符,检查输入文件每一行内容:比如IT 12345 ELYY的字符数为2(IT)+3空格+5(12345)+5空格+4(ELYY)=19,完全符合定义,这部分没有问题。

修复后预期效果

程序会循环读取所有7条输入记录,并将全部内容输出到OUTPUT.TXT中。

内容的提问来源于stack exchange,提问作者BaraHinozuka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:40:09