2016-09-04 8 views
0

Как видно из названия, мне трудно получить желаемый результат для моей программы COBOL. Программа берет данные из файла и выводит их в определенном формате, это для домашнего задания. Когда я запускаю программу, она работает для заголовка имени, заголовка школы и заголовка столбца. Первый курс работает отлично, тогда выход начинает срезаться на один и испортит все мои другие выходы.Форматирование ввода/вывода файлов COBOL

Пример входного файла

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 Project

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

Скорее всего, ваши данные-записи на один байт «короче», чем ваши данные-определение записей. Вы еще не сказали компилятору, поэтому помните, что вам нужно было бы включить байт для терминатора записи, но только один. –

+0

Да, я вручную подсчитал свои определения данных, включая свободное место в конце и новый символ линии в моем наполнителе. курс - 13 пробелов, название - 32, класс - 4 пробела, поэтому я могу иметь подавленное число для последующих вычислений заработанных и 3 в месте заполнения, включая терминатор строки. – CoryC

+1

Пятно на сэр, я исправил его с помощью значения наполнителя, в которое я включил слишком много пробелов. Бесконечно благодарен. – CoryC

ответ

0

Мой COBOL очень ржавый, но я не думаю, что «Z» во входных форматов будет работать. Подавляющее подавление нулей - это только форматы вывода. Вы можете просто заменить начальные пробелы нулями перед тем, как что-либо сделать с данными. Попробуйте что-нибудь вроде:

INSPECT Earned REPLACING ALL SPACES BY '0'. 

после чтения (и изменить формат ввода до 99.99). Это обычная проблема, но я не помню, как я справлялся с ней.

+0

№ В соответствии со стандартом COBOL, это должно быть просто буквенно-цифровое перемещение. С 1985 года, если цель была числовым полем, это было бы «де-редактирование» MOVE, где форматирование «отменено». Но так оно и есть, оно по-прежнему является альфа-цифровым MOVE и не будет влиять, совершенно корректно и ничем не повлияет. –