Windows 11下OPENCOBOLILE读取CRLF变长文本文件报错1000求助
解决OpenCOBOL-ILE在Windows读取CRLF变长文本文件的1000错误码问题
问题根源
你遇到的1000错误码(文件大小错误),核心原因是OpenCOBOL-ILE默认的文件处理逻辑和AS/400 COBOL不同:
- Windows下的CRLF格式文本是行式顺序文件,但你的代码未明确指定文件组织方式,OpenCOBOL会按默认的固定长度记录处理;
- 你定义的FD记录是固定1024字节,但实际文件是变长行,导致读取时长度不匹配触发错误。
具体解决步骤
1. 明确指定文件组织为行式顺序
在SELECT语句中添加ORGANIZATION IS LINE SEQUENTIAL,告诉OpenCOBOL这是按行存储的文本文件,自动识别CRLF作为行分隔符:
select tasklist ASSIGN TO 'g:\temp\tasklist.txt' ORGANIZATION IS LINE SEQUENTIAL file status is ws-if-status.
2. 调整FD记录定义适配变长行
将固定长度的记录定义改为足够容纳最长行的固定长度记录(行式模式下会自动截断到行尾):
fd tasklist. 01 Ws-Input-Data pic x(2048). // 定义足够大的长度覆盖最长行
如果需要解析特定字段,读取后再对Ws-Input-Data进行子串截取,比如:
// 读取后提取ws-id-name MOVE Ws-Input-Data(2:12) TO ws-id-name // 跳过第一个字符,取12位
3. 修正PROCEDURE DIVISION中的变量错误
你的代码中DISPLAY ws-value-string是未定义的变量,改为实际存在的变量(比如Ws-Input-Data或ws-id-name):
PERFORM UNTIL WS-EOF='Y' READ tasklist at end display ws-if-status MOVE 'Y' TO WS-EOF NOT AT END DISPLAY Ws-Input-Data // 改为已定义的变量 END-READ END-PERFORM.
4. 可选:设置OpenCOBOL环境变量适配Windows
如果仍有问题,可设置环境变量强制OpenCOBOL使用Windows文件系统规则:
set COBOL_FILESYSTEM=Windows
完整修改后的代码示例
Environment division. input-output section. file-control. select webinput assign to KEYBOARD file status is ws-in-status. select tasklist ASSIGN TO 'g:\temp\tasklist.txt' ORGANIZATION IS LINE SEQUENTIAL file status is ws-if-status. data division. file section. fd webinput. 01 chunk-of-post pic x(1024). fd tasklist. 01 Ws-Input-Data pic x(2048). working-storage section. 01 WS-EOF pic x value 'N'. 01 ws-id-name pic x(12). 01 ws-if-status pic xx. 01 ws-in-status pic xx. PROCEDURE DIVISION. OPEN InPUT tasklist. display ws-if-status. PERFORM UNTIL WS-EOF='Y' READ tasklist at end display ws-if-status MOVE 'Y' TO WS-EOF NOT AT END MOVE Ws-Input-Data(2:12) TO ws-id-name DISPLAY ws-id-name END-READ END-PERFORM. CLOSE tasklist. STOP RUN.
内容的提问来源于stack exchange,提问作者Jim French
相关产品推荐
相关产品推荐

