You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:25:02