COBOL程序编译报错:INPUT-FILE等文件未定义问题求助
COBOL编译错误:文件标识符未定义的原因与解决方法
错误原因分析
- 缺少文件关联定义:FILE SECTION中的
FD INPUT-FILE和FD OUTPUT-FILE未添加ASSIGN子句,这是COBOL标准强制要求的配置,编译器无法识别未关联物理文件的逻辑文件标识符。 - INPUT-FILENAME变量未声明:程序中使用
ACCEPT INPUT-FILENAME读取文件名,但未在WORKING-STORAGE SECTION中定义该变量,导致编译器提示未定义。 - OPEN语句用法错误:COBOL的OPEN语句操作对象是FILE SECTION中定义的逻辑文件标识符(如INPUT-FILE),不能直接用字符串变量替代。动态指定文件名需要通过特定语法实现,而非直接替换OPEN中的文件标识符。
解决步骤
- 为逻辑文件添加ASSIGN关联
在FD语句后补充ASSIGN子句,根据编译器环境选择合适的关联方式:- 若使用GnuCOBOL,可使用
ASSIGN TO DYNAMIC支持动态文件名;也可静态关联物理文件,如ASSIGN TO "inputinput.txt"。
- 若使用GnuCOBOL,可使用
- 声明INPUT-FILENAME变量
在WORKING-STORAGE SECTION中添加77级变量存储输入文件名:77 INPUT-FILENAME PIC X(256). - 修正动态文件名的OPEN逻辑
若使用支持动态文件名的编译器(如GnuCOBOL),需先用SET FILE-ID设置文件名,再执行OPEN操作。
修正后的代码示例
IDENTIFICATION DIVISION. PROGRAM-ID. Calculate-Mean-StdDev. DATA DIVISION. FILE SECTION. FD INPUT-FILE ASSIGN TO DYNAMIC. 01 INPUT-VALUE-RECORD. 02 IN-X PIC S9(6)V9(2). 02 FILLER PIC X(72). FD OUTPUT-FILE ASSIGN TO "output.txt". 01 OUTPUT-RECORD. 02 OUTPUT-LINE PIC X(80). WORKING-STORAGE SECTION. 77 SUM-OF-X-SQR PIC 9(14)V9(2). 77 SUM-OF-X PIC S9(10)V9(2). 77 N PIC S9(4). 77 MEAN PIC S9(6)V9(2). 77 I PIC S9(4). 77 INPUT-FILENAME PIC X(256). 01 ARRAY-AREA. 02 X PIC S9(6)V9(2) OCCURS 1000 TIMES. 01 OUTPUT-TITLE-LINE. 02 FILLER PIC X(28) VALUE " MEAN AND STANDARD DEVIATION". 01 OUTPUT-UNDERLINE. 02 FILLER PIC X(28) VALUE "----------------------------". 01 OUTPUT-COL-HEADS. 02 FILLER PIC X(10) VALUE SPACES. 02 FILLER PIC X(11) VALUE "DATA VALUES". 01 OUTPUT-DATA-LINE. 02 FILLER PIC X(10) VALUE SPACES. 02 OUT-X PIC -(6)9.9(2). 01 OUTPUT-RESULTS-LINE-1. 02 FILLER PIC X(9) VALUE " MEAN= ". 02 OUT-MEAN PIC -(6)9.9(2). 01 OUTPUT-RESULTS-LINE-2. 02 FILLER PIC X(9) VALUE " STD DEV=". 02 STD-DEVIATION PIC -(6)9.9(2). PROCEDURE DIVISION. DISPLAY "Enter the input file name: " ACCEPT INPUT-FILENAME SET FILE-ID OF INPUT-FILE TO INPUT-FILENAME OPEN INPUT INPUT-FILE OUTPUT OUTPUT-FILE. MOVE ZERO TO IN-X. PERFORM PROC-BODY UNTIL IN-X IS NOT LESS THAN 999999.99. PERFORM END-OF-JOB. PROC-BODY. WRITE OUTPUT-RECORD FROM OUTPUT-TITLE-LINE AFTER ADVANCING 0 LINES. WRITE OUTPUT-RECORD FROM OUTPUT-UNDERLINE AFTER ADVANCING 1 LINE. WRITE OUTPUT-RECORD FROM OUTPUT-COL-HEADS AFTER ADVANCING 1 LINE. WRITE OUTPUT-RECORD FROM OUTPUT-UNDERLINE AFTER ADVANCING 1 LINE. MOVE ZERO TO SUM-OF-X. READ INPUT-FILE INTO INPUT-VALUE-RECORD AT END PERFORM END-OF-JOB. PERFORM INPUT-LOOP VARYING N FROM 1 BY 1 UNTIL N IS GREATER THAN 1000 OR IN-X IS NOT LESS THAN 999999.98. SUBTRACT 1 FROM N. DIVIDE N INTO SUM-OF-X GIVING MEAN ROUNDED. MOVE ZERO TO SUM-OF-X-SQR. PERFORM SUM-LOOP VARYING I FROM 1 BY 1 UNTIL I IS GREATER THAN N. COMPUTE STD-DEVIATION ROUNDED = (SUM-OF-X-SQR / N) ** 0.5. WRITE OUTPUT-RECORD FROM OUTPUT-UNDERLINE AFTER ADVANCING 1 LINE. MOVE MEAN TO OUT-MEAN. WRITE OUTPUT-RECORD FROM OUTPUT-RESULTS-LINE-1 AFTER ADVANCING 1 LINE. WRITE OUTPUT-RECORD FROM OUTPUT-RESULTS-LINE-2 AFTER ADVANCING 1 LINE. INPUT-LOOP. MOVE IN-X TO X(N), OUT-X. WRITE OUTPUT-RECORD FROM OUTPUT-DATA-LINE AFTER ADVANCING 1 LINE. ADD X(N) TO SUM-OF-X. READ INPUT-FILE INTO INPUT-VALUE-RECORD AT END PERFORM END-OF-JOB. SUM-LOOP. COMPUTE SUM-OF-X-SQR = SUM-OF-X-SQR + (X(I) - MEAN) ** 2. END-OF-JOB. CLOSE INPUT-FILE, OUTPUT-FILE. STOP RUN.
额外说明
- 若使用传统COBOL编译器(如IBM Enterprise COBOL),动态文件名的实现方式不同,可能需要通过JCL指定DDNAME或使用编译器扩展语法。
- 所有程序中用到的变量必须在对应数据段中声明,避免未定义类编译错误。
内容的提问来源于stack exchange,提问作者user23756814
相关产品推荐
相关产品推荐

