我正在学习 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 中动态分配表,所以现在我回到了第一个方向。
如有任何帮助,我们将不胜感激。
我不是100%确定你的“单一问题”是什么,但有一些事情可以说:
我发现这是因为字符串不能像 C 或 Python 中那样下标/索引
可以参考,只是不一样:
-> 就像您使用它一样。
但罪魁祸首可能是您启用了运行时检查 - 在这种情况下您会得到越界(您收到的编译警告也暗示了这一点)。
程序没有输出任何内容
完成的第一个语句(在第一个中,
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
。