2014-09-27 2 views
0

У меня есть код ошибки 18 в COBOL, когда я пытаюсь записать вывод в файл. Я использую Micro Focus VS 2012. Я пробовал все, но, похоже, на этот раз не печатает вывод правильно.Код ошибки COBOL 18

... 
    ENVIRONMENT DIVISION. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 

     SELECT GRADE-FILE ASSIGN TO 'Grades.txt'. 

     SELECT PRINT-FILE ASSIGN TO 'Output.txt' 
     ORGANIZATION IS LINE SEQUENTIAL. 


    DATA DIVISION. 
    FILE SECTION. 
    FD GRADE-FILE 
     LABEL RECORDS ARE STANDARD. 
    01 GRADE-RECORD. 
     05 I-STUDENT PIC X(14). 
     05 I-GRADE1 PIC 999. 
     05 I-GRADE2 PIC 999. 
     05 I-GRADE3 PIC 999. 
     05 I-GRADE4 PIC 999. 
     05 I-GRADE5 PIC 999. 
     05 I-GRADE6 PIC 999. 

    FD PRINT-FILE 
     LABEL RECORDS ARE STANDARD. 
    01 PRINT-RECORD PIC X(80). 


    WORKING-STORAGE SECTION. 
    01 PROGRAM-VARIABLES. 
     05 W-AVERAGE PIC 999V99. 
     05 W-EOF-FLAG PIC X VALUE 'N'. 

    01 PAGE-TITLE. 
     05 PIC X(46) VALUE 
     ' S I X W E E K G R A D E R E P O R T'. 

    01 HEADING-LINE1. 
     05 PIC X(51) VALUE 
     ' Student  T e s t S c o r e s Average'. 

    01 HEADING-LINE2. 
     05 PIC X(51) VALUE 
     '--------------------------------------------------'. 

    01 DETAIL-LINE. 
     05     PIC X VALUE SPACE. 
     05 O-STUDENT   PIC X(14). 
     05     PIC X VALUE SPACE. 
     05 O-GRADE1   PIC ZZ9. 
     05     PIC X VALUE SPACE. 
     05 O-GRADE2   PIC ZZ9. 
     05     PIC X VALUE SPACE. 
     05 O-GRADE3   PIC ZZ9. 
     05     PIC X VALUE SPACE. 
     05 O-GRADE4   PIC ZZ9. 
     05     PIC X VALUE SPACE. 
     05 O-GRADE5   PIC ZZ9. 
     05     PIC X VALUE SPACE. 
     05 O-GRADE6   PIC ZZ9. 
     05     PIC X(4) VALUE SPACE. 
     05 O-AVERAGE   PIC ZZ9.99. 

    PROCEDURE DIVISION. 
    10-MAINLINE. 
     OPEN INPUT GRADE-FILE 
      OUTPUT PRINT-FILE 
     PERFORM 20-PRINT-HEADINGS 
     PERFORM 30-PROCESS-LOOP 
     CLOSE GRADE-FILE 
      PRINT-FILE 
     STOP RUN. 

    20-PRINT-HEADINGS. 
     MOVE PAGE-TITLE TO PRINT-RECORD 
     WRITE PRINT-RECORD AFTER ADVANCING 1 LINE 
     MOVE HEADING-LINE1 TO PRINT-RECORD 
     WRITE PRINT-RECORD AFTER ADVANCING 3 LINES 
     MOVE HEADING-LINE2 TO PRINT-RECORD 
     WRITE PRINT-RECORD AFTER ADVANCING 1 LINE. 

    30-PROCESS-LOOP. 
    * PERFORM 40-READ-RECORD 
     READ GRADE-FILE 
     PERFORM UNTIL W-EOF-FLAG = 'Y' 
      PERFORM 50-COMPUTE-GRADE-AVERAGE 
      PERFORM 60-PRINT-DETAIL-LINE 
      READ GRADE-FILE 
    *  PERFORM 40-READ-RECORD 
     END-PERFORM. 

    *40-READ-RECORD. 
    * READ GRADE-FILE 
    *  AT END MOVE 'Y' TO W-EOF-FLAG. 

    50-COMPUTE-GRADE-AVERAGE. 
     COMPUTE W-AVERAGE ROUNDED = (I-GRADE1 + I-GRADE2 + I-GRADE3 + I-GRADE4 + I-GRADE5 + I-GRADE6)/6. 

    60-PRINT-DETAIL-LINE. 
     MOVE SPACES TO DETAIL-LINE 
     MOVE I-STUDENT TO O-STUDENT 
     MOVE I-GRADE1 TO O-GRADE1 
     MOVE I-GRADE2 TO O-GRADE2 
     MOVE I-GRADE3 TO O-GRADE3 
     MOVE I-GRADE4 TO O-GRADE4 
     MOVE I-GRADE5 TO O-GRADE5 
     MOVE I-GRADE6 TO O-GRADE6 
     MOVE W-AVERAGE TO O-AVERAGE 
     WRITE PRINT-RECORD FROM DETAIL-LINE AFTER ADVANCING 1 LINE. 

    end program "GradeReport.Program1" 

S I X W E E K G R A D E R E P O R T 


Student  T e s t S c o r e s Average 
-------------------------------------------------- 
KellyAntonetz0 700 500 980 800 650 852 747.00 
obertCain09708 207 907 309 406 2;1 25> 400.67 
Dehaven0810870 940 850 930 892 122 981 785.83 
rmon0760770800 810 750 92; 142 9>1 <1> 816.33 
g0990930890830 940 901 =1> 41= ?82 65 872.50 
06707108408809 6=9 ;52 565 <<0 900 870 924.33 
78052076089Woo 493 9>4 520 760 760 830 734.50 
+1

Было бы полезно указать, где возникает ошибка, например, в OPEN или в WRITE? также используйте СТАТУС ФАЙЛА, у вас есть отдельный ОТКРЫТО для ввода и вывода и посмотрите, что означает ошибка 18 в вашем компиляторе. – NoChance

+1

Вы не показываете входные данные образца. «Z0» в первой строке вывода подозрительно - я бы посмотрел на вашу файловую организацию, если бы вы были вами. «Числовые» данные в теле отчета должны дать вам ключ. Тот факт, что необычно иметь ученика с именем «obert ...», должен указывать на то, что ваши входные данные не читаются правильно - оттуда это GIGO. Кажется, вы читаете записи фиксированной длины из файла с записями данных переменной длины. – Magoo

+0

Совет ЭммадКарема хорош, и Магу заметил какой-то ключ. Вам нужно показать свои входные записи. Кажется, что пространство, которое должно разделять первые два элемента имени на первой записи, «каким-то образом» «отсутствует» (COBOL этого не сделал), как и другие пробелы в именах. Ваши входные данные имеют переменную длину, влияя на поле имени, и это приводит к тому, что все остальные поля будут «тянуть» влево. Перед программой COBOL «что-то» взяло все пробелы от ваших имен. –

ответ

2

Что-то до вашей программы COBOL протравило ваш файл, удалив все пробелы и перетасовывая данные влево.

Ваш первый студент показывает как KellyAntonetz, но, вероятно, должен быть Kelly Antonetz. Поскольку только одно место было удалено, данные класса переместились только на одно место влево, поэтому числа все еще узнаваемы, и хотя среднее значение составляет 10 раз, оно приблизительно верно.

На самом деле это не правильно (за исключением мощности 10) из-за этого 2 после 85. Откуда у этого 2?

Это произошло со следующей записи, где первое имя должно быть Робертом, но вы показываете как obertCain09708. Код ASCII для буквы R равен X'82 '. Когда код COBOL обрабатывается как номер, 8 будет проигнорирован (или приведет к сбою, когда в байте конечного числа). Ваш компилятор не вызывает сбой кода, но обрабатывает R как номер 2.

obertCain - всего 9 байт из 14, которые вы указали для имени. Пять пробелов/пробелов, которые были «потеряны» на этот раз, приводят к выталкиванию цифр - осталось пятью байтами. С этого момента, объясняя, как вывод, который вы показываете, соответствует предполагаемому вводу, становится только академическим упражнением.

Дальнейшая поддержка является ссылка на то, что будет FILE STATUS код 18 от компилятора Micro Focus, здесь: http://www.simotime.com/vsmfsk01.htm

Который говорит, для 18:

Read part record error: EOF before EOR or file open in wrong mode (Micro Focus).

Ваш окончательный отчет будет " закончить "до того, как ожидается, с обнаружением конца файла до того, как будет прочитано 32 байта.

Обратите внимание, что ошибка находится на вашем файле, а не на вашем выходном файле.

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

Обратите внимание на комментарии Эммада Карея. Используйте FILE STATUS. Проверяйте поле статуса файла (укажите один на один файл) после каждого ввода-вывода, чтобы вы знали, когда возникает проблема, и в чем проблема.

Тестирование поля состояния файла для 10 на файл, который вы читаете, последовательно дает код очистки, отличный от AT END, на READ.

Обратите также внимание, что если ваша программа не разбилась там, она будет либо бесконечно, либо крутиться сразу же после этого. Вероятно, пытаясь исправить вашу проблему, вы прокомментировали свое использование «прочитанного абзаца», и в этом пункте это единственное место, где вы устанавливаете конец файла.

Если вы используете статус файла вместо AT END, вам не нужно определять флаг/переключатель, вы можете использовать 88 в поле статуса файла и установить время выполнения COBOL для вас непосредственно , без необходимости его кодировать.

Всего пару пунктов о вашей ДЕТАЛИ-ЛИНИИ.

Не обязательно Нужны (не названные) НАПОЛНИТЕЛИ. Попробуйте это:

01 DETAIL-LINE. 
     05 O-STUDENT   PIC BX(14). 
     05 O-GRADE1   PIC ZZZ9. 
     05 O-GRADE2   PIC ZZZ9. 
     05 O-GRADE3   PIC ZZZ9. 
     05 O-GRADE4   PIC ZZZ9. 
     05 O-GRADE5   PIC ZZZ9. 
     05 O-GRADE6   PIC ZZZ9. 
     05 O-AVERAGE   PIC Z(6)9.99. 

Если вы работаете с COBOL, вы можете увидеть этот тип вещи, так что это хорошо знать. При огромных объемах выпуска, вероятно, небольшое снижение производительности. Вы можете найти более удобным для вывода «выстраивания» в заголовки.

Ах. Соединяясь, вы не используете LINE SEQUENTIAL для своего входного файла, я предсказываю, что у вас есть «скрипт», выполняющий некоторое время перед программой COBOL, которая должна удалить терминаторы записи (независимо от того, что находится в вашей ОС) в конце каждого но вы случайно удалили все whitespace со всех позиций вашей записи.

С LINE SEQUENTIAL вы можете иметь записи фиксированной длины, которые также оказываются «завершенными». Если это упражнение специально не включает удаление терминаторов записи, просто используйте LINE SEQUENTIAL.

Если вы хотите удалить терминаторы, не делайте этого для whitespace, который слишком много охватывает (конкретный), а также «привязывает» изменение к концу записи.

Смежные вопросы