GnuCOBOL写入Line Sequential文件时保留尾随空格的实现疑问
在GnuCOBOL中保留Line Sequential文件的尾随空格并生成正确CRLF
方案一:使用Line Sequential并禁用尾随空格修剪
GnuCOBOL默认会对Line Sequential文件的记录修剪尾随空格,再添加CRLF。可以通过扩展语法或编译选项禁用这个行为:
方法1:修改FILE-CONTROL子句
直接在文件选择中添加WITH NO TRIMMING扩展子句,无需修改其他代码:
FILE-CONTROL. SELECT OUTFILE ASSIGN 'O:\BATCH_JOBS\TMP\TRAILING-SPACES.COBOL.TXT' ORGANIZATION IS LINE SEQUENTIAL WITH NO TRIMMING.
方法2:编译时添加选项
如果不想修改代码,编译时指定-ftrim-line-sequential=no选项:
cobc -ftrim-line-sequential=no TRAILING-SPACES.cob
两种方式都能让原代码保留ABC 的尾随空格,同时自动生成正确的CRLF换行。
方案二:使用Sequential组织+二进制模式手动写入CRLF
如果需要完全控制输出格式,可采用Sequential组织并以二进制模式打开文件,避免GnuCOBOL自动处理换行:
IDENTIFICATION DIVISION. PROGRAM-ID. TRAILING-SPACES. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT OUTFILE ASSIGN 'O:\BATCH_JOBS\TMP\TRAILING-SPACES.COBOL.TXT' ORGANIZATION IS SEQUENTIAL BINARY. DATA DIVISION. FILE SECTION. FD OUTFILE DATA RECORD IS OUT-RECORD. 01 OUT-RECORD. 05 STUFF PIC X(5). 05 CR-LF PIC X(2) VALUE X'0D0A'. PROCEDURE DIVISION. OPEN OUTPUT OUTFILE. MOVE 'ABCDE' TO STUFF. WRITE OUT-RECORD. MOVE 'ABC ' TO STUFF. WRITE OUT-RECORD. CLOSE OUTFILE. STOP RUN.
关键说明
BINARY子句让文件以二进制模式打开,GnuCOBOL不会转换任何字符,确保你写入的X'0D0A'直接输出为CRLF。- 将CR和LF合并为一个X(2)字段,简化记录结构,避免单独定义可能出现的字段赋值问题。
你之前的代码出现NUL字符,是因为未指定二进制模式,GnuCOBOL将文件视为文本模式,自动处理换行时破坏了手动写入的控制字符,或默认的固定长度记录填充导致多余NUL。
内容的提问来源于stack exchange,提问作者SubwayDawg
相关产品推荐
相关产品推荐

