COBOL程序创建文件成功但无法写入内容问题排查
COBOL程序创建文件但无法写入内容的问题排查与修复
核心问题:文件记录定义与WRITE操作不匹配
你在FILE SECTION中给OUT-FILE定义的记录F-EKRAN是一个包含两个73字节字段的复合结构(总长度146字节),但程序中直接对其子字段F-TEXT或F-LINE执行WRITE操作。对于LINE SEQUENTIAL组织的文本文件,COBOL要求每次WRITE必须针对完整的01级记录,直接写入子字段会导致数据写入异常(比如编译器忽略操作、写入不完整数据),最终文件为空。
修复方案
1. 修改文件记录定义
将OUT-FILE的记录改为单个行记录,对应文本文件的一行:
DATA DIVISION. FILE SECTION. FD OUT-FILE. 01 OUT-RECORD PIC X(73). // 单个73字节的行记录,匹配你的E-WIDTH常量
2. 调整WRITE操作逻辑
把原来写入子字段的逻辑,改为先将内容移动到完整记录,再执行WRITE:
// 替换原有的WRITE F-TEXT和WRITE F-LINE代码 MOVE FUNCTION CONCATENATE("STEP: ", S-STEP) TO OUT-RECORD. WRITE OUT-RECORD. MOVE 1 TO Y-POS. PERFORM E-HEIGHT TIMES MOVE E-LINE(Y-POS) TO OUT-RECORD WRITE OUT-RECORD ADD 1 TO Y-POS END-PERFORM. // 最后写入END的部分也改成完整记录写入 MOVE "END" TO OUT-RECORD. WRITE OUT-RECORD.
3. 其他细节优化
- 部分编译器要求
WRITE语句加上END-WRITE,写法更规范:WRITE OUT-RECORD END-WRITE. - 确保程序正常执行到
CLOSE OUT-FILE语句——文件关闭时会强制刷新缓冲区,把内存中的数据写入磁盘。
修复后的关键代码片段
修改后的文件定义和核心写入逻辑示例:
DATA DIVISION. FILE SECTION. FD OUT-FILE. 01 OUT-RECORD PIC X(73). WORKING-STORAGE SECTION. // 保留原有其他变量定义... PROCEDURE DIVISION. MAIN. OPEN OUTPUT OUT-FILE. // 原有初始化逻辑(INIT-EKRAN、RANDOM-ITEM等)... LOOP. MOVE 1 TO Y-POS. MOVE E-STEP TO S-STEP. DISPLAY FUNCTION CONCATENATE("STEP: ", S-STEP). PERFORM DRAW-EKRAN E-HEIGHT TIMES. // 修复后的写入逻辑 MOVE FUNCTION CONCATENATE("STEP: ", S-STEP) TO OUT-RECORD. WRITE OUT-RECORD. MOVE 1 TO Y-POS. PERFORM E-HEIGHT TIMES MOVE E-LINE(Y-POS) TO OUT-RECORD WRITE OUT-RECORD ADD 1 TO Y-POS END-PERFORM. PERFORM NEW-EKRAN. DISPLAY "CONTYNUE? (Y/N)". ACCEPT E-TEMP. IF NOT ( E-TEMP = "N") MOVE "Y" TO E-TEMP. ADD 1 TO E-STEP. IF E-TEMP = "Y" GO TO LOOP. MOVE "END" TO OUT-RECORD. WRITE OUT-RECORD. DISPLAY "END". CLOSE OUT-FILE. STOP RUN.
内容的提问来源于stack exchange,提问作者alexniklaus
相关产品推荐
相关产品推荐

