COBOL错误代码18

时间:2014-09-27 06:11:00

标签: cobol

当我尝试将输出写入文件时,我在COBOL中有一个错误代码18。我正在使用Micro Focus VS 2012.我已尝试过所有内容,但此时似乎无法正确打印输出。

   ...
   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 个答案:

答案 0 :(得分:2)

COBOL程序之前的东西通过删除所有空格并将数据向左移动来腌制文件。

您的第一位学生显示为KellyAntonetz,但可能应为Kelly Antonetz。由于只删除了一个空格,因此等级数据仅向左移动一个位置,因此数字仍然可识别,尽管平均值是10的因子,但它大致正确。

由于2之后85,因此实际上并不正确(除了10的幂)。 2来自哪里?

它来自下一个记录,其中名字应该是罗伯特,但你显示为obertCain09708。字母R的ASCII码是X&#39; 82&#39;。当被COBOL视为数字时,8将被忽略(或者在数字的尾随字节中将导致崩溃)。您的编译器不会导致代码崩溃,但会将R视为数字2

obertCain只是你名字中14个字节的9个字节。已经失去的五个空格/空白&#34;这次导致数字被拉了五个字节。从那时起,解释你所展示的输出如何符合假定的输入只是一个学术练习。

进一步的支持是Micro Focus编译器的FILE STATUS代码为18的参考,在这里:http://www.simotime.com/vsmfsk01.htm

对于18

  

读取部件记录错误:EOR之前的EOF或文件在错误模式下打开   (微焦点)。

你的最终记录将完成&#34;在预期之前,在读取32个字节之前检测到文件结束。

请注意,错误发生在输入文件中,而不是输出文件。

以这种方式丢失空间可以通过多种方式完成,因此在进入COBOL程序之前我无法猜测你对文件做了什么,但是COBOL本身和你的代码都没有这样做。

记下Emmad Kareem的评论。使用FILE STATUS。检查每个IO后的文件状态字段(每个文件定义一个),以便您知道问题何时发生,以及问题所在。

在您正在阅读的文件上测试10的文件状态字段可以提供比AT END上的READ更清晰的代码。

另请注意,如果您的程序没有在那里崩溃,它将无限循环或之后不久崩溃。可能在试图解决您的问题时,您已经注释掉了对&#34;读取段落&#34;的使用。并且在该段中是您设置文件结尾的唯一位置。

如果你使用文件状态而不是AT END,你不需要定义一个标志/开关,你可以在文件状态字段上使用88并让COBOL运行时为你设置它直接,无需编码。

关于您的DETAIL-LINE只有几点。

当您移动到每个命名字段时,不需要MOVE SPACE,并且(未命名的)FILLER具有VALUE SPACE。

你不必 需要(未命名的)FILLERS。试试这个:

   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,你可能会看到这种类型的东西,所以很高兴知道。由于产量很大,可能会有很小的性能损失。您可能会发现它更便于排队&#34;输出到标题。

阿。让你不使用LINE SEQUENTIAL输入文件,我预测你有一个&#34;脚本&#34;在COBOL程序之前运行一段时间,该程序应该在每个逻辑记录的末尾删除记录终止符(无论你的操作系统上是什么),但是你不小心从记录的所有位置删除了所有whitespace代替。

使用LINE SEQUENTIAL,您可以拥有固定长度的记录,这些记录也恰好是&#34;终止&#34;。除非练习特别包括删除记录终止符,否则只需使用LINE SEQUENTIAL

如果您应该移除终结者,请不要执行whitespace,因为{{1}}涵盖太多(具体)以及&#34;锚定&#34;改变到记录的结尾。