cobol - 无法获得正确的文件输出

标签 cobol gnucobol

这是一项家庭作业,涉及读入输入文件、进行一些处理以及将处理后的数据以简洁且可读的格式打印到输出文件。

第一条记录完美打印到输出文件。此后的每条记录,似乎在从输入文件读入该记录时,都是在读入时添加了空格;改变我所有输入数据的位置并使其无用。每行似乎都添加了另一个空格。

我怀疑 A.) 尽管我尽了最大努力,但我还是没有完全理解 READ 动词 和/或 B.) 我的编译器可能有问题。

感谢任何帮助。

IDENTIFICATION DIVISION.
        PROGRAM-ID.            
                payroll.

ENVIRONMENT DIVISION.
        INPUT-OUTPUT SECTION.
                FILE-CONTROL.
                        SELECT payroll-in-file  ASSIGN TO 'input.txt'.
                        SELECT payroll-out-file ASSIGN TO 'output.txt'.

DATA DIVISION.
        FILE SECTION.
                FD payroll-in-file
                        LABEL RECORDS ARE STANDARD.  
                01 payroll-in-record.  
                        05 i-unused-01          PIC X.  
                        05 i-emp-num            PIC X(5).
                        05 i-dpt-num            PIC X(5).
                        05 1-unused-02          PIC X(6).
                        05 i-hrs-wkd            PIC 9(4).  
                        05 i-base-pay-rt        PIC 9(2)v99.  
                        05 i-mncpl-code         PIC X(2).

                FD payroll-out-file
                        LABEL RECORDS ARE STANDARD.
                01 payroll-out-record.
                        05 o-emp-num            PIC X(5).
                        05 FILLER               PIC XX.
                        05 o-hrs-wkd            PIC 9(5).
                        05 FILLER               PIC XX.
                        05 o-base-pay-rt        PIC 9(3).99.
                        05 FILLER               PIC XX.  
                        05 o-grs-pay            PIC 9(5).99.
                        05 FILLER               PIC XX.
                        05 o-fed-tax            PIC 9(5).99.  
                        05 FILLER               PIC XX.  
                        05 o-state-tax          PIC 9(4).99.
                        05 FILLER               PIC XX.
                        05 o-city-tax           PIC 9(4).99.
                        05 FILLER               PIC XX.
                        05 o-net-pay            PIC 9(5).99.

        WORKING-STORAGE SECTION.
                01 w-out-of-data-flag           PIC X.
                01 w-grs-pay                    PIC 99999V99.
                01 w-fed-tax                    PIC 99999V99.
                01 w-state-tax                  PIC 9999V99.
                01 w-city-tax                   PIC 9999V99.

PROCEDURE DIVISION.
        A000-main-line-routine.
                OPEN INPUT payroll-in-file
                        OUTPUT payroll-out-file.
                MOVE 'N' TO w-out-of-data-flag.
                READ payroll-in-file
                        AT END MOVE 'Y' TO w-out-of-data-flag.
                PERFORM B010-process-payroll
                        UNTIL w-out-of-data-flag = 'Y'.
                CLOSE payroll-in-file
                        payroll-out-file.
                STOP RUN.

        B010-process-payroll.
                MOVE SPACES TO payroll-out-record.
                IF i-hrs-wkd IS NOT GREATER THAN 37.5
                        MULTIPLY i-hrs-wkd BY i-base-pay-rt GIVING w-grs-pay ROUNDED
                ELSE
                        COMPUTE w-grs-pay ROUNDED =
                                        (i-base-pay-rt * 37.5) + (1.5 * (i-base-pay-rt) * (i-hrs-wkd - 37.5))
                END-IF.
                MULTIPLY w-grs-pay BY 0.25
                        GIVING w-fed-tax ROUNDED.
                MULTIPLY w-grs-pay BY 0.05
                        GIVING w-state-tax ROUNDED.  
                IF              i-mncpl-code = 03
                        MULTIPLY w-grs-pay BY 0.015 GIVING w-city-tax ROUNDED
                ELSE IF         i-mncpl-code = 07
                        MULTIPLY w-grs-pay BY 0.02 GIVING w-city-tax ROUNDED
                ELSE IF         i-mncpl-code = 15
                        MULTIPLY w-grs-pay BY 0.0525 GIVING w-city-tax ROUNDED
                ELSE IF         i-mncpl-code = 23
                        MULTIPLY w-grs-pay BY 0.0375 GIVING w-city-tax ROUNDED
                ELSE IF         i-mncpl-code = 77
                        MULTIPLY w-grs-pay BY 0.025 GIVING w-city-tax ROUNDED

                    END-IF.

输入文件:

 AA34511ASD      0037115003
 AA45611WER      0055120007
 BB98722TYU      0025075015
 BB15933HUJ      0080200023
 FF35799CGB      0040145077

(每行以1个空格开头,对应代码中的“i-unused-01”)

输出文件(到目前为止):

AA345  00037  011.50  00425.50  00106.38  0021.28  0006.38  00291.46 AA45  0 005  051.20  00425.50  00106.38  0021.28  0006.38  00291.46
 BB9  0  00  025.07  00425.50  00106.38  0021.28  0006.38  00291.465
 BB  0   0  008.02  00425.50  00106.38  0021.28  0006.38  00291.4623
 F  0      000.40  10673.10  02668.28  0533.66  0006.38  07464.78

^它就这样打印!

在 Linux 中使用 OpenCOBOL 编译器。

最佳答案

我没有详细查看代码,但有两件事值得一看。

首先,输出文件可能应该是“行顺序”的,因为这将插入一个分隔符(回车/换行符),这意味着输出文件将打印为每行一个记录。

此外,输入记录(即实际数据)中的字符数与输入 FD 中定义的字符数之间可能存在 1 个字符的差异。

关于cobol - 无法获得正确的文件输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12614622/

相关文章:

cobol - ACCEPT "ESC-CODE FROM ESCAPE KEY"问题

cobol - 接受签名值作为记录的一部分

excel - 需要将 Cobol 数据文件转换为 CSV、Excel

cobol - COBOL如何存储和检索数据?

c# - 用 C# 动态读取 COBOL 重新定义

cobol - 如何在cobol中清除屏幕并将光标位置设置到屏幕末尾

boolean - 如何在 COBOL 中返回 true

cobol - OpenCOBOL 入门! ("Hello world!")

Cobol 与 C 的接口(interface)

java - 是否存在一种在 COBOL 中标准化的 Java 互操作形式?