2016-09-04 9 views
0

제목에서 알 수 있듯이 COBOL 프로그램에 원하는 출력을 얻는데 어려움이 있습니다. 이 프로그램은 파일에서 데이터를 가져 와서 특정 형식으로 출력합니다. 이것은 숙제를위한 것입니다. 프로그램을 실행할 때 이름 헤더, schoolID 헤더 및 열 헤더에 대해 작동합니다. 첫 번째 코스는 정상적으로 작동하고 출력은 하나씩 끊기 시작하고 다른 모든 출력은 엉망이됩니다. COBOL 파일 I/O 서식 지정

입력 파일 예

CMPS161 ALGORITHM DSGN/IMPLMNT I A 3.00 CMPS280 ALGORITHM DSGN/IMPLEM II B 3.00

출력 파일 바람직한 예

<Name> <schoolID> Course Title GR Earned CMPS161 ALGORITHM DSGN/IMPLMNT I A 3.00 CMPS280 ALGORITHM DSGN/IMPLEM II B 3.00

출력 실제 예

<Name> <schoolID> Course Title GR Earned CMPS161 ALGORITHM DSGN/IMPLMNT I A 0.00 MPS280 ALGORITHM DSGN/IMPLEM II B 0.00

COBOL 프로젝트

IDENTIFICATION DIVISION. 
PROGRAM-ID.  P2. 
ENVIRONMENT DIVISION. 
INPUT-OUTPUT SECTION. 
FILE-CONTROL. 
     SELECT myInFile ASSIGN TO "P2In.dat". 
     SELECT myOutFile ASSIGN TO "P2Out.dat". 
DATA DIVISION. 
FILE SECTION. 
FD myInFile. 
01 inRecord. 
    02 Course PIC X(13). 
    02 Title PIC X(32). 
    02 Grade PIC X(4). 
    02 Earned PIC Z9.99. 
    02 FILLER PIC X(3). 
FD myOutFile. 
01 outRecord. 
    02 myCourse PIC X(13). 
    02 myTitle PIC X(32). 
    02 myGrade PIC X(4). 
    02 myEarned PIC Z9.99. 
    02 FILLER PIC X(3). 
WORKING-STORAGE SECTION. 
01 E0F PIC X(3) VALUE "NO ". 
01 NAME-HDR. 
    05 FILLER PIC X(10) VALUE "NAME HERE ". 
01 SCHOOLID-HDR. 
    05 FILLER PIC X(8) VALUE "SCHOOLID" 
01 COLUMN-HDR. 
    05 FILLER PIC X(6) VALUE "COURSE". 
    05 FILLER PIC X(6) VALUE SPACES. 
    05 FILLER PIC X(6) VALUE "TITLE". 
    05 FILLER PIC X(6) VALUE SPACES. 
    05 FILLER PIC X(6) VALUE "GR". 
    05 FILLER PIC X(6) VALUE SPACES. 
    05 FILLER PIC X(6) VALUE "EARNED". 
PROCEDURE DIVISION. 
MAIN-PROGRAM. 
    PERFORM HEADER. 
    PERFORM FILE-IO. 
    PERFORM CLOSING. 
    STOP RUN. 
HEADER. 
    OPEN INPUT myInFile 
     OUTPUT myOutFile. 
    WRITE outRecord FROM NAME-HDR 
      AFTER ADVANCING 1 LINE. 
    WRITE outRecord FROM SCHOOLID-HDR 
      AFTER ADVANCING 1 LINE. 
    WRITE outRecord FROM COLUMN-HDR 
      AFTER ADVANCING 2 LINES. 
    MOVE SPACES TO outRecord. 
    WRITE outRecord 
      AFTER ADVANCING 1 LINE. 
    FILE-IO. 
     READ myInFile 
      AT END 
       MOVE "YES" TO EOF. 
     PERFORM PROCESS-RECORD 
     UNTIL EOF = "YES". 
    PROCESS-RECORD. 
     MOVE SPACES TO outRecord. 
     MOVE Course to myCourse. 
     MOVE Title to myTitle. 
     MOVE Grade to myGrade. 
     MOVE Earned to myEarned. 
     WRITE outRecord 
      AFTER ADVANCING 1 LINE. 
     READ myInFile 
      AT END 
       MOVE "YES" TO EOF. 
    CLOSING. 
     CLOSE myInFile 
       myOutFile. 
+3

데이터 레코드가 레코드의 데이터 정의보다 1 바이트 "짧습니다"가능성이 가장 높습니다. 그렇지 않다면 컴파일러에게 말하지 않았으므로 레코드 종료자가 바이트를 포함해야한다는 것을 기억하십시오. –

+0

예 필자는 필자의 끝에있는 여유 공간과 줄 바꿈 문자를 포함하여 데이터 정의를 계산했습니다. 코스는 13 칸이며, 제목은 32이고, 성적은 4 칸이므로 나중에 계산을 위해 억압 된 숫자를 가질 수 있고 줄 종결자를 포함한 필러 지점에 3을 가질 수 있습니다. – CoryC

+1

각하, 나는 너무 많은 공간을 포함하는 필러 값으로 고정 시켰습니다. 대단히 감사합니다. – CoryC

답변

0

내 COBOL은 매우 녹슨하지만 난 입력 형식의 'Z'가 작동 할 것이라고 생각하지 않습니다. 선행 제로 억제는 출력 형식에만 사용됩니다. 데이터를 처리하기 전에 선행 공백을 0으로 대체해야 할 수 있습니다. 다음과 같이 시도하십시오 :

INSPECT Earned REPLACING ALL SPACES BY '0'. 

읽기 후 (입력 형식을 99.99로 변경). 일반적인 문제이지만 어떻게 처리했는지 기억이 안납니다.

+0

아니요. COBOL 표준에 따르면, 문자 숫자 식 MOVE 여야합니다. 1985 년 이후로 대상이 숫자 필드 인 경우 형식이 "반전 됨"인 "편집 취소"이동이있었습니다. 그러나 그대로 있더라도 영숫자 이동이며 영향을 미치지 않으며 완벽하게 유효하며 아무 영향을 미치지 않습니다. –