2012-09-27 117 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)序列。