COBOL程序写入输出文件时丢失部分数据问题求助
COBOL程序输出截断问题的解决方案
问题根源分析
你的程序无法完整写入数据,主要由以下三个问题导致:
1. 输出记录长度不匹配
WS-DETALLE总长度为78字符,远大于REG-REPORTE定义的50字符。执行WRITE操作时,发送区长度超过接收区,会触发编译器错误、截断数据,甚至直接终止程序执行。
2. 计数变量名错误
你在WORKING-STORAGE中定义的计数变量是WS-LEIDOS-EMP,但在PROCEDURE DIVISION中错误使用了WS-TOT-LEIDOS——该变量属于WS-DETALLE-LEIDOS,未设置初始值,默认是空格。对空格执行数值加法操作会引发数据异常,导致程序中断。
3. 输入文件标签定义错误
对于普通文本文件,LABEL RECORDS ARE STANDARD会让编译器误判文件结构(该选项适用于带标准标签的磁带/特殊格式文件),应改为LABEL RECORDS ARE OMITTED,否则可能导致读取记录异常。
修正后的代码
IDENTIFICATION DIVISION. PROGRAM-ID. PROG01. ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT EMPLEADOS ASSIGN TO "C:\COBOL\Archivos\EMPLEADOS.txt" ORGANIZATION IS LINE SEQUENTIAL. SELECT REPORTE ASSIGN TO "C:\COBOL\Archivos\REPORTE.txt" ORGANIZATION IS LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD EMPLEADOS LABEL RECORDS ARE OMITTED RECORD CONTAINS 50 CHARACTERS BLOCK CONTAINS 0 RECORDS DATA RECORD IS REG-EMPLEADOS. 01 REG-EMPLEADOS PIC X(50). FD REPORTE LABEL RECORDS ARE OMITTED RECORD CONTAINS 78 CHARACTERS BLOCK CONTAINS 0 RECORDS DATA RECORD IS REG-REPORTE. 01 REG-REPORTE PIC X(78). WORKING-STORAGE SECTION. 01 WS-AREAS-A-USAR. 05 WS-REG-EMPLEADOS. 10 WS-NUMERO-EMP PIC 9(05). 10 WS-NOMBRE-EMP PIC X(30). 10 WS-STATUS-EMP PIC 9(01). 10 WS-DEPTO-EMP PIC 9(03). 10 WS-PUESTO-EMP PIC 9(02). 10 WS-SALARIO-EMP PIC 9(07)V99. 05 WS-LEIDOS-EMP PIC 9(05) VALUE ZEROS. 05 WS-IMPRESOS PIC 9(05) VALUE ZEROS. 05 WS-TOTAL-SALARIOS PIC 9(09)V99 VALUE ZEROS. 01 WS-TITULO-1. 05 FILLER PIC X(27) VALUE SPACES. 05 WS-TIT-1 PIC X(25) VALUE "EMPLEADOS DE LA EMPRESA: ". 05 FILLER PIC X(26) VALUE SPACES. // 调整长度适配78字符 01 WS-TITULO-2. 05 FILLER PIC X(01) VALUE "/". 01 WS-DETALLE. 05 FILLER PIC X(04) VALUE SPACES. 05 WS-DET-NUMERO PIC ZZZZ9. 05 FILLER PIC X(04) VALUE SPACES. 05 WS-DET-NOMBRE PIC X(30). 05 FILLER PIC X(04) VALUE SPACES. 05 WS-DET-STATUS PIC 9(01). 05 FILLER PIC X(04) VALUE SPACES. 05 WS-DET-DEPTO PIC 9(03). 05 FILLER PIC X(04) VALUE SPACES. 05 WS-DET-PUESTO PIC 9(02). 05 FILLER PIC X(03) VALUE SPACES. 05 WS-DET-SALARIO PIC Z,ZZZ,ZZ9.99. 05 FILLER PIC X(04) VALUE SPACES. 01 WS-DETALLE-LEIDOS. 05 FILLER PIC X(01). 05 FILLER PIC X(29) VALUE "TOTAL DE EMPLEADOS LEIDOS : ". 05 WS-TOT-LEIDOS PIC 9(05). 05 FILLER PIC X(43) VALUE SPACES. // 调整长度适配78字符 01 WS-DETALLE-IMPRESOS. 05 FILLER PIC X(01). 05 FILLER PIC X(29) VALUE "TOTAL DE EMPLEADOS IMPRESOS: ". 05 WS-TOT-IMPRESOS PIC 9(05). 05 FILLER PIC X(43) VALUE SPACES. // 调整长度适配78字符 PROCEDURE DIVISION. 010-INICIO. OPEN INPUT EMPLEADOS OUTPUT REPORTE WRITE REG-REPORTE FROM WS-TITULO-1. 020-LEE. READ EMPLEADOS INTO WS-REG-EMPLEADOS AT END GO TO 100-FIN. ADD 1 TO WS-LEIDOS-EMP MOVE WS-NUMERO-EMP TO WS-DET-NUMERO MOVE WS-NOMBRE-EMP TO WS-DET-NOMBRE MOVE WS-STATUS-EMP TO WS-DET-STATUS MOVE WS-DEPTO-EMP TO WS-DET-DEPTO MOVE WS-PUESTO-EMP TO WS-DET-PUESTO MOVE WS-SALARIO-EMP TO WS-DET-SALARIO WRITE REG-REPORTE FROM WS-DETALLE AFTER ADVANCING 1 ADD 1 TO WS-IMPRESOS GO TO 020-LEE. 100-FIN. MOVE WS-LEIDOS-EMP TO WS-TOT-LEIDOS MOVE WS-IMPRESOS TO WS-TOT-IMPRESOS WRITE REG-REPORTE FROM WS-DETALLE-LEIDOS AFTER ADVANCING 1 WRITE REG-REPORTE FROM WS-DETALLE-IMPRESOS AFTER ADVANCING 1 CLOSE EMPLEADOS REPORTE GOBACK.
关键修正点说明
- 将输入输出文件的
LABEL RECORDS ARE STANDARD改为LABEL RECORDS ARE OMITTED,并添加ORGANIZATION IS LINE SEQUENTIAL适配文本文件格式。 - 调整
REG-REPORTE的长度为78字符,匹配WS-DETALLE的总长度,避免写入截断。 - 修正计数变量:将
ADD 1 TO WS-TOT-LEIDOS改为ADD 1 TO WS-LEIDOS-EMP,并在最终输出前将WS-LEIDOS-EMP的值移动到WS-TOT-LEIDOS中。 - 调整标题和统计行的FILLER长度,使其适配78字符的输出记录。
- 添加了
WS-IMPRESOS的计数逻辑,完善统计功能。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

