无法获得正确的文件输出

时间:2012-09-27 05:26:06

标签: cobol gnucobol

这是一项家庭作业,包括读入输入文件,进行一些处理,以及以简洁易读的格式将处理过的数据打印到输出文件。

第一条记录完美地打印到输出文件。之后的每条记录,似乎从输入文件中读入记录时,它被读入并增加了空间;改变我所有输入数据的位置并使其无用。每条线似乎都是另一个空间。

我怀疑 答:尽管我付出了最大的努力,但我并不完全理解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编译器。

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

正如colemanj所说,你需要将输出文件更改为行顺序

但您还需要更改输入文件/输入文件定义。 2个选项是 1)将输入文件更改为行顺序(使定义与文件一致 2)从输入文件中删除carraige返回(全部在一行):

AA34511ASD      0037115003 AA45611WER      0055120007 BB98722TYU      0025075015 BB15933HUJ      0080200023 FF35799CGB      0040145077

当前输入文件定义表明文件中没有回车符。

--------------------------------------------------

答案 2 :(得分:0)

这可能是由于您使用的Mingw Open COBOL版本。正如这里记录的那样

组织是线序 这些是所有内部结构中最简单的文件。它们的内容简单地构成一系列数据记录,每个记录都由一个特殊的记录结束分隔符字符终止。 ASCII换行符(十六进制0A)是任何UNIX或伪UNIX(MinGW,Cygwin,MacOS)OpenCOBOL构建使用的记录结束分隔符。真正的本机Windows构建将使用回车符,换行符(十六进制0D0A)序列。