2012-09-27 33 views
1

这是一项家庭作业任务,涉及读取输入文件,执行一些处理以及将处理后的数据以整洁可读的格式打印到输出文件。无法获得正确的文件输出

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

我怀疑 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-未使用-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编译器。

+0

已经提供了很好的建议。查看Open Cobol程序员指南:[4.2.1.1组织顺序文件](http://opencobol.add1tocobol.com/OpenCOBOL%20Programmers%20Guide.pdf)。 – NealB

回答

1

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

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

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

1

正如colemanj说,你需要改变输出文件,以线序

但你也需要改变输入文件/输入文件的定义。 的2个选项是 1)更改输入文件到线顺序的(使定义成符合文件 2)上的一个行中删除从所述输入文件carraige返回到(全部):

AA34511ASD  0037115003 AA45611WER  0055120007 BB98722TYU  0025075015 BB15933HUJ  0080200023 FF35799CGB  0040145077 

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

-------------------------------------------------- 
0

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

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