按顺序写入文件组织行时保留尾随空格

问题描述 投票:0回答:1

我正在使用 GnuCOBOL 并写入文件,组织是按行顺序的,并且我需要保留尾随空格。行顺序附加 [CR][LF] 字符,但在删除尾随空格后执行此操作。

       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 LINE SEQUENTIAL.

       DATA DIVISION.
       FILE SECTION.
       FD OUTFILE
           DATA RECORD IS OUT-RECORD.

       01 OUT-RECORD.
          05 STUFF PIC X(5).

       PROCEDURE DIVISION.
           OPEN OUTPUT OUTFILE.

           MOVE 'ABCDE' TO STUFF.
           WRITE OUT-RECORD.

           MOVE 'ABC  ' TO STUFF.
           WRITE OUT-RECORD.

           CLOSE OUTFILE.
           STOP RUN.

输出是

ABCDE[CR][LF]

ABC[CR][LF]

我怎样才能得到输出

ABCDE[CR][LF]

ABC[空格][空格][CR][LF]

我尝试将文件声明为组织是连续的并生成 [CR][LF],但我似乎无法让它工作。

       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.

       DATA DIVISION.
       FILE SECTION.
       FD OUTFILE
           DATA RECORD IS OUT-RECORD.

       01 OUT-RECORD.
          05 STUFF PIC X(5).
          05 CR PIC X(1) VALUE X'0D'.
          05 LF PIC X(1) VALUE X'0A'.

       PROCEDURE DIVISION.
           OPEN OUTPUT OUTFILE.

           MOVE 'ABCDE' TO STUFF.
           WRITE OUT-RECORD.

           MOVE 'ABC  ' TO STUFF.
           WRITE OUT-RECORD.

           CLOSE OUTFILE.
           STOP RUN.

输出是

ABCDE[NUL][NUL]ABC[空格][空格][NUL][NUL]

谢谢大家!

cobol gnucobol
1个回答
0
投票

ORGANIZATION LINE SEQUENTIAL
在 COBOL2023 中被标准化,同时几个实现对此做了不同的处理。

GnuCOBOL 默认遵循标准,但允许您调整行为,请参阅“附录 I 运行时配置,文件 IO”下的 手册(或您的运行时配置

runtime.cfg
,请参阅
cobcrun --runtime-config
检查其所在位置):

Environment name:  COB_LS_FIXED
  Parameter name:  ls_fixed
         Purpose:  Defines if LINE SEQUENTIAL files should be fixed length
                   (or variable, by removing trailing spaces)
           Alias:  STRIP_TRAILING_SPACES  (0 = yes)
            Type:  boolean
         Default:  false
            Note:  This setting is most useful if you want to REWRITE those
                   files.
         Example:  LS_FIXED TRUE

Environment name:  COB_LS_VALIDATE
  Parameter name:  ls_validate
         Purpose:  Defines for LINE SEQUENTIAL files that the data should be
                   validated as it is read (status 09) / written (status 71).
            Type:  boolean
         Default:  true (per COBOL 2022)
            Note:  If active effectively disables COB_LS_NULLS.
         Example:  LS_VALIDATE FALSE

Environment name:  COB_LS_NULLS
  Parameter name:  ls_nulls
         Purpose:  Defines for LINE SEQUENTIAL files what to do with data
                   which is not DISPLAY type.  This could happen if a LINE
                   SEQUENTIAL record has BINARY/COMP data fields in it.
            Type:  boolean
         Default:  false
            Note:  The TRUE setting will insert a null character x"00" before
                   those values to escape them, and redo on read-in plus
                   validating that they only occur after a null character.
                   Decreases LINE SEQUENTIAL performance and prevents writing
                   escape sequences or formatting within the data.
                   Only checked if COB_LS_VALIDATE is disabled.
         Example:  LS_NULL = TRUE

Environment name:  COB_LS_SPLIT
  Parameter name:  ls_split
         Purpose:  Defines for LINE SEQUENTIAL files what to do when a record
                   is longer than the program handles. If 'ls_split=true' then
                   the data is returned as multiple records with io status 06,
                   otherwise the record is truncated, io status set to 04 and
                   the file skips to the next LF.
            Type:  boolean
         Default:  true (per COBOL 2022)
         Example:  LS_SPLIT = FALSE

如果您想全局更改它,请编辑您的runtime.cfg(或者通常更好,创建一个自己的)以包含

ls_fixed = true
ls_split = false

作为替代方案:只需将其放入环境中

SET COB_LS_FIXED=1
SET COB_LS_SPLIT=0

或者在处理文件之前从 COBOL 程序执行此操作:

SET ENVIRONMENT "COB_LS_FIXED" TO "1"
SET ENVIRONMENT "COB_LS_SPLIT" TO "0"

但请记住,如果您的记录长度很大,也会发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.