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

COBOL程序输出文件名可配置实现及编译器兼容问题咨询

COBOL实现可配置输出文件名及自动适配名称长度(兼容无DYNAMIC/INTO/EOF的编译器)

核心问题解决思路

  1. 动态文件名替代方案:由于编译器不支持DYNAMIC关键字,直接将文件名变量绑定到SELECT语句,但必须清理ACCEPT输入的尾部空格,否则会导致文件名识别错误。
  2. 名称长度自动适配:通过COBOL基础字符串操作计算输入名称的实际有效长度,按需截断或填充到输出字段,替代INTO的动态分配功能。
  3. 文件结束判断:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:26:09