COBOL逐行读取文本文件异常:按固定长度读取而非换行分割
COBOL逐行读取文本文件的问题解决思路
嘿,我最近在写COBOL代码读取文本文件时踩了个头疼的坑——本来想按文件里的换行符逐行读取内容,但现在的代码却是等填满25个字符才会触发下一次读取,完全没按预期的逻辑来。
先贴一下我当前的代码片段:
file-control. select input-file assign input-file-name organization is sequential file section. fd input-file. 01 input-file-record picture x(25) working-storage section. 01 ws-eof picture a(1). * 读取文件的逻辑 perform until ws-eof = 'Y' read input-file into input-file-record at end move 'Y' to ws-eof not at end display input-file-record end-read end-perform close input-file
我的目标文本文件内容是这样的:
AAAA
BBBB
CCCC
DDDD
问题根源
之所以会出现“按固定长度读取而非逐行”的情况,是因为COBOL默认的sequential组织方式是固定长度记录模式——你定义了picture x(25),它就会严格每次读取25个字符,完全无视文本中的换行符。而咱们的目标文件是可变长度的行式文本文件,每行用换行符分隔,所以得调整文件的组织定义。
解决方案:改用Line Sequential组织方式
要实现逐行读取,只需要把文件定义改成**行顺序(line sequential)**模式,COBOL会自动识别换行符作为记录分隔符。具体修改如下:
file-control. select input-file assign input-file-name organization is line sequential file section. fd input-file. 01 input-file-record picture x(80). *> 设置一个足够长的长度,覆盖文件中最长的行 working-storage section. 01 ws-eof picture a(1) value 'N'. *> 初始化EOF标记,避免初始值不确定的问题 * 读取逻辑优化(去掉into也可以,因为fd已经关联了记录) perform until ws-eof = 'Y' read input-file at end move 'Y' to ws-eof not at end display input-file-record end-read end-perform close input-file
额外注意事项
- 使用
line sequential时,COBOL会自动忽略每行末尾的换行符,你读取到的就是每行的实际内容 - 记录长度只要设置得比文件中最长的行更长即可,多余的位置会被填充空格,但不会影响你获取有效行内容
- 初始化
ws-eof为'N'是个规范的编程习惯,能避免因初始值未知导致的逻辑错误
内容的提问来源于stack exchange,提问作者rezon
相关产品推荐
相关产品推荐

