COBOL 下标可变长度字符串

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

我正在学习 COBOL 并尝试使用 C 样式文件 i/o 读取未格式化的文件(一次读取 x 个字节)。到目前为止,我已经成功地一次读取一个字节的文件,但我无法将文件的内容存储在变量中。

我尝试过的代码是这样的:

        IDENTIFICATION DIVISION.
        PROGRAM-ID. FILEREADER.

        ENVIRONMENT DIVISION.
        INPUT-OUTPUT SECTION.
        FILE-CONTROL.
            SELECT FILE-TO-READ
            ASSIGN USING INPUT-FILE-NAME 
            ORGANIZATION IS SEQUENTIAL
            ACCESS IS SEQUENTIAL.

        DATA DIVISION.
        FILE SECTION.
        FD FILE-TO-READ.
            01 CHAR PIC X(1).

        WORKING-STORAGE SECTION.
        01 FILE-DATA-POINTER USAGE IS POINTER.
        01 FILE-DATA-HOLDER PIC X BASED.
        01 INPUT-DATA.
            05 INPUT-FILE-NAME PIC X(100). 
            05 INPUT-FILE-CHARACTERS PIC 9(18).
        01 MISC-DATA.
           05 EOF PIC X(1).
           05 STRING-INDEX PIC 9(18) USAGE IS COMP.
        PROCEDURE DIVISION.
        MAIN.
            PERFORM GET-INPUT.
            PERFORM ALLOCATE-STORAGE.
            PERFORM READ-FILE.
            PERFORM DISPLAY-FILE.
            PERFORM CLEAN-UP.
            STOP RUN.

        GET-INPUT.
            DISPLAY "Please enter the name of the file (maximum 100 char
      -     "acters)."
            ACCEPT INPUT-FILE-NAME.

            DISPLAY "Please enter the number of characters in your file
      -     "(the number of bytes)."
            ACCEPT INPUT-FILE-CHARACTERS.

        ALLOCATE-STORAGE.
            ALLOCATE INPUT-FILE-CHARACTERS CHARACTERS RETURNING
            FILE-DATA-POINTER SET ADDRESS OF FILE-DATA-HOLDER TO
            FILE-DATA-POINTER.
            
            IF ADDRESS OF FILE-DATA-POINTER = NULL
                DISPLAY "System error when allocating RAM. Exiting..."
                STOP RUN
            END-IF.

        READ-FILE.
            INITIALIZE STRING-INDEX.
            MOVE 'N' TO EOF.
            MOVE 1 TO STRING-INDEX.
            OPEN INPUT FILE-TO-READ.
                PERFORM UNTIL EOF = 'Y'
                    READ FILE-TO-READ 
                        AT END MOVE 'Y' TO EOF
                        NOT AT END MOVE CHAR TO FILE-DATA-HOLDER
                        (STRING-INDEX:1)

                        ADD 1 TO STRING-INDEX    
                    END-READ
                END-PERFORM.
           CLOSE FILE-TO-READ.
       
        DISPLAY-FILE.
            DISPLAY FILE-DATA-HOLDER.
       
        CLEAN-UP.
            FREE FILE-DATA-POINTER.

编译此程序时,我收到警告:

file_reader.cbl:64: warning: suspicious reference-modification: always using max. length [-Wothers]
   62 |                     READ FILE-TO-READ
   63 |                         AT END MOVE 'Y' TO EOF
   64 >                         NOT AT END MOVE CHAR TO FILE-DATA-HOLDER
   65 |                         (STRING-INDEX:1)

该程序没有输出任何内容,经过一些研究,我发现这是因为字符串不能像 C 或 Python 中那样进行下标/索引。然后我尝试使用字符数组(表)而不是字符串,但这不起作用,因为您显然无法在 COBOL 中动态分配表,所以现在我回到了第一个方向。

如有任何帮助,我们将不胜感激。

dynamic-memory-allocation cobol subscript gnucobol
1个回答
0
投票

我不是100%确定你的“单一问题”是什么,但有一些事情可以说:

我发现这是因为字符串不能像 C 或 Python 中那样下标/索引

可以参考,只是不一样:

  • COBOL 称之为引用修改,并且始终意味着“start:length”
  • 位置是从 1 开始的,而不是从 0 开始

-> 就像您使用它一样。
但罪魁祸首可能是您启用了运行时检查 - 在这种情况下您会得到越界(您收到的编译警告也暗示了这一点)。

程序没有输出任何内容

完成的第一个语句(在第一个中,

PERFORM
)是一个
DISPLAY
,后跟一个
ACCEPT
- 因此,如果没有输出,那么您的 GnuCOBOL 安装或执行该程序的方式似乎被打破了。

您显然无法在 COBOL 中动态分配表

可以,COBOL2014 内置了

OCCURS DYNAMIC
(但警告:GnuCOBOL 在 2023 年不支持此功能)。 IBM 的一个扩展(在 Micro Focus COBOL 中不可用,但在 GnuCOBOL 中可用)是
OCCURS UNBOUNDED
,它明确用于类似的事情。您可以将其定义为
01 FILE-DATA-HOLDER. 05 FILLER OCCURS UNBOUNDED DEPENDING ON INPUT-FILE-CHARACTERS PIC X.
中的
LINKAGE SECTION

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