GNU COBOL顺序文件记录显示异常问题求助
COBOL顺序文件读取混乱问题的解决方案
问题原因
你遇到的输出混乱问题,核心是默认SEQUENTIAL组织的文件处理逻辑和你的输入文件格式不匹配:
- GNU COBOL中,
ORGANIZATION IS SEQUENTIAL默认按定长无分隔记录处理,不会识别换行符作为记录边界。程序会严格按你定义的PIC X(40)截取40字节作为一条记录,不管输入中的换行,导致换行符被读入字段,显示时触发额外换行,打乱输出格式。 - 你的输入文件每条记录(不含换行)长度是41字符,超过了程序定义的40字节,剩余字符会被当作下一条记录的开头,进一步导致记录拆分错误。
解决方案
方案1:使用LINE SEQUENTIAL组织(推荐)
LINE SEQUENTIAL是COBOL专门为文本行格式文件设计的组织方式,会自动将换行符作为记录分隔符,读取时自动剔除换行符,只保留行内文本内容。
修改后的程序关键部分:
ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT DataFile ASSIGN TO "data.dat" ORGANIZATION IS LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD DataFile. 01 DataRecord. 05 RecordField PIC X(50). // 调整长度,确保容纳最长行内容
方案2:保持SEQUENTIAL组织,指定记录分隔符
如果必须使用SEQUENTIAL,可以通过指定记录分隔符让程序识别换行:
ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT DataFile ASSIGN TO "data.dat" ORGANIZATION IS SEQUENTIAL RECORD DELIMITER IS LINE FEED. // 指定换行符为记录分隔符
同样需要调整RecordField的长度到足够容纳每条记录的内容(比如X(50))。
完整修改示例(方案1)
IDENTIFICATION DIVISION. PROGRAM-ID. ReadSequentialFile. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT DataFile ASSIGN TO "data.dat" ORGANIZATION IS LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD DataFile. 01 DataRecord. 05 RecordField PIC X(50). WORKING-STORAGE SECTION. 01 WS-EOF PIC X VALUE 'N'. PROCEDURE DIVISION. OPEN INPUT DataFile. PERFORM UNTIL WS-EOF = 'Y' READ DataFile AT END MOVE 'Y' TO WS-EOF NOT AT END DISPLAY "REKORD" SPACE RecordField END-PERFORM. CLOSE DataFile. STOP RUN.
效果说明
修改后程序会正确将输入文件的每一行作为一条完整记录读取,换行符被自动处理,不会出现在输出中,每条记录的内容也能完整显示。
内容的提问来源于stack exchange,提问作者Tomaszcygan
相关产品推荐
相关产品推荐

