COBOL程序输出文件名可配置实现及编译器兼容问题咨询
COBOL实现可配置输出文件名及自动适配名称长度(兼容无DYNAMIC/INTO/EOF的编译器)
核心问题解决思路
- 动态文件名替代方案:由于编译器不支持
DYNAMIC关键字,直接将文件名变量绑定到SELECT语句,但必须清理ACCEPT输入的尾部空格,否则会导致文件名识别错误。 - 名称长度自动适配:通过COBOL基础字符串操作计算输入名称的实际有效长度,按需截断或填充到输出字段,替代
INTO的动态分配功能。 - 文件结束判断:使用
FILE STATUS变量替代EOF关键字,判断文件读取是否完成。
修改后的完整代码
IDENTIFICATION DIVISION. PROGRAM-ID. HelloProgram. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT OutputFile ASSIGN TO WS-FILE-NAME ORGANIZATION IS SEQUENTIAL FILE STATUS IS WS-FILE-STATUS. *> 新增文件状态变量,替代EOF判断 DATA DIVISION. FILE SECTION. FD OutputFile. 01 OutputRecord. 05 Field1 PIC X(6). 05 Field2 PIC X(6). 05 Field3 PIC XX. WORKING-STORAGE SECTION. 01 WS-FILE-NAME PIC X(20). *> 存储用户输入的文件名 01 WS-FILE-STATUS PIC XX. *> 文件操作状态码:00=成功,10=文件结束 01 WS-NAME PIC X(50). *> 用户输入的名称 01 WS-NAME-LEN PIC 9(2) VALUE 0. *> 存储名称的实际有效长度 01 WS-TRAILING-SPACES PIC 9(2) VALUE 0. *> 名称尾部空格数 PROCEDURE DIVISION. ACCEPT-FILE-NAME. DISPLAY "Enter output file name:" WITH NO ADVANCING ACCEPT WS-FILE-NAME. *> 清理文件名尾部空格,避免无效文件名 INSPECT REVERSE(WS-FILE-NAME) TALLYING WS-TRAILING-SPACES FOR LEADING SPACES. COMPUTE WS-NAME-LEN = 20 - WS-TRAILING-SPACES. *> 将有效文件名左对齐,尾部补空格(适配部分编译器固定长度要求) STRING WS-FILE-NAME(1:WS-NAME-LEN) DELIMITED BY SPACE INTO WS-FILE-NAME. ACCEPT-NAME. DISPLAY "Enter your name: " WITH NO ADVANCING. ACCEPT WS-NAME. *> 计算名称的实际有效长度 INSPECT REVERSE(WS-NAME) TALLYING WS-TRAILING-SPACES FOR LEADING SPACES. COMPUTE WS-NAME-LEN = 50 - WS-TRAILING-SPACES. WRITE-TO-FILE. OPEN OUTPUT OutputFile. IF WS-FILE-STATUS NOT = "00" DISPLAY "Failed to open output file. Status: " WS-FILE-STATUS STOP RUN. MOVE "Hello " TO Field1 OF OutputRecord. *> 根据实际长度适配Field2:长度超过6则截断前6位,否则左移补空格 IF WS-NAME-LEN > 6 MOVE WS-NAME(1:6) TO Field2 OF OutputRecord ELSE MOVE WS-NAME(1:WS-NAME-LEN) TO Field2 OF OutputRecord INSPECT Field2 OF OutputRecord REPLACING TRAILING SPACES BY SPACES. *> 补空格到固定长度 MOVE "!" TO Field3 OF OutputRecord. WRITE OutputRecord. CLOSE OutputFile. READ-FROM-FILE. OPEN INPUT OutputFile. IF WS-FILE-STATUS NOT = "00" DISPLAY "Failed to open input file. Status: " WS-FILE-STATUS STOP RUN. READ OutputFile. *> 通过文件状态码判断是否读取完成(10代表文件结束) PERFORM UNTIL WS-FILE-STATUS = "10" DISPLAY "Record read: " OutputRecord READ OutputFile END-PERFORM. CLOSE OutputFile. MAIN-LOGIC SECTION. PERFORM ACCEPT-FILE-NAME. PERFORM ACCEPT-NAME. PERFORM WRITE-TO-FILE. PERFORM READ-FROM-FILE. STOP RUN.
关键修改说明
- 文件名处理:通过
INSPECT REVERSE()统计尾部空格,提取有效文件名,避免ACCEPT自动补的空格导致文件找不到。 - 名称长度适配:先计算输入名称的实际长度,再根据输出字段(Field2)的长度决定截断或填充,确保内容合理存储。
- 文件状态判断:用
FILE STATUS变量的10状态码替代EOF,实现文件读取的循环结束判断,兼容不支持EOF的编译器。
内容的提问来源于stack exchange,提问作者Manya Tiwari
相关产品推荐
相关产品推荐

