Форматирование ввода-вывода файла COBOL

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

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

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

КОБОЛ проект

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.

person CoryC    schedule 04.09.2016    source источник
comment
Скорее всего, ваши записи данных на один байт короче, чем ваше определение данных записей. Вы не сказали компилятору иначе, поэтому помните, что вам нужно будет включить байт для обозначения конца записи, но только один.   -  person Bill Woodger    schedule 04.09.2016
comment
Да, я вручную подсчитал свои определения данных, включая свободное пространство в конце и символ новой строки в моем заполнителе. курс — 13 пробелов, заголовок — 32, оценка — 4 пробела, поэтому я могу иметь скрытое число для последующих вычислений в заработанных и 3 в месте заполнения, включая признак конца строки.   -  person CoryC    schedule 04.09.2016
comment
Точно, сэр, я исправил это со значением наполнителя, которое включало слишком много пробелов. Бесконечно благодарен.   -  person CoryC    schedule 04.09.2016
comment
@bill-woodger: похоже, вы опубликовали ответ, не могли бы вы повторно опубликовать его, чтобы OP принял его (и, следовательно, как бы закрыл этот вопрос)?   -  person Simon Sobisch    schedule 05.09.2016


Ответы (1)


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

INSPECT Earned REPLACING ALL SPACES BY '0'.

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

person Mick    schedule 04.09.2016
comment
Нет. Согласно стандарту COBOL, это должно быть просто буквенно-цифровое MOVE. С 1985 года, если бы целью было числовое поле, это был бы MOVE для отмены редактирования, где форматирование было обратным. Но как бы то ни было, это все еще буквенно-цифровой MOVE и не повлияет, совершенно действителен и ни на что не повлияет. - person Bill Woodger; 04.09.2016