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
相关产品推荐
相关产品推荐

