COBOL错误代码18

COBOL错误代码18,cobol,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

当我试图将输出写入文件时,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
。。。
环境司。
输入输出部分。
文件控制。
选择GRADE-FILE分配给“Grades.txt”。
选择打印文件分配到“Output.txt”
组织是按行顺序的。
数据司。
文件部分。
等级档案
标签记录是标准的。
01级记录。
05 I-STUDENT图片X(14)。
05 I-grade 1 PIC 999。
05 I-grade 2 PIC 999。
05 I-grade 3 PIC 999。
05 I-grade 4 PIC 999。
05 I-grade 5 PIC 999。
05 I-grade 6 PIC 999。
FD打印文件
标签记录是标准的。
01打印记录图片X(80)。
工作和储存科。
01程序变量。
05 W-平均PIC 999V99。
05 W-EOF-FLAG PIC X值“N”。
01页标题。
05 picx(46)值
“S I X W E K R A D R P O T”。
01标题行1。
05 picx(51)值
“学生平均成绩”。
01标题行2。
05 picx(51)值
'--------------------------------------------------'.
01详图-LINE。
05 PIC X值空间。
05 O学生图片X(14)。
05 PIC X值空间。
05 O级1图ZZ9。
05 PIC X值空间。
05 O级2图ZZ9。
05 PIC X值空间。
05 O级3图ZZ9。
05 PIC X值空间。
05 O-grade 4图ZZ9。
05 PIC X值空间。
05 O级5图ZZ9。
05 PIC X值空间。
05 O-Grade 6图ZZ9。
05 PIC X(4)值空间。
05 O-平均图ZZ9.99。
程序司。
10号干线。
打开输入文件
输出打印文件
执行20个打印标题
执行30进程循环
关闭年级档案
打印文件
停,跑。
20个打印标题。
将页面标题移动到打印记录
前进1行后写入打印记录
将标题行1移动到打印记录
前进3行后写入打印记录
将标题行2移动到打印记录
前进1行后写打印记录。
30-PROCESS-LOOP。
*执行40次读取记录
读取分级文件
执行直到W-EOF-FLAG='Y'
执行50级平均成绩
执行60-PRINT-DETAIL-LINE
读取分级文件
*执行40次读取记录
结束表演。
*40读记录。
*读取分级文件
*在末尾,将“Y”移动到W-EOF-FLAG。
平均50分。
计算W-平均四舍五入=(I-grade 1+I-grade 2+I-grade 3+I-grade 4+I-grade 5+I-grade 6)/6。
60-打印-详细信息-行。
将空间移动到详图线
将I-STUDENT移动到O-STUDENT
将I-Grade 1移至O-Grade 1
将I-Grade 2移至O-Grade 2
将I-Grade 3移至O-Grade 3
将I-Grade 4移至O-Grade 4
将I-Grade 5移至O-Grade 5
将I-Grade 6移至O-Grade 6
将W平均值移动到O平均值
前进1行后,从详图行写入打印记录。
结束程序“GradeReport.Program1”
S I X W E K R A D R O R T
学生平均成绩
--------------------------------------------------
KellyAntonetz0 700 500 980 800 650 852 747.00
OBERCAIN 09708 207 907 309 406 2;1 25>    400.67
德哈文0810870 940 850 930 892 122 981 785.83
RMON07607708010 750 92;142 9>1     816.33
G0990930890830940901=1>41=?82 65 872.50

06707108408809 6=9 ;52 565您的COBOL程序之前的某个程序通过删除所有空格并将数据洗牌到左侧,对您的文件进行了pickle处理

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

由于
85
后面的
2
,它实际上并不正确(10的幂除外)。那
2
是从哪里来的

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

obertCain
仅为名称的14个字节中的9个字节。这一次“丢失”的五个空格/空格导致数字向左拉五个字节。从那时起,解释你所展示的输出如何符合假定的输入就成了一项学术练习

进一步支持是Micro Focus编译器的文件状态代码为18的参考,如下所示:

这表示,对于
18

读取零件记录错误:EOR前EOF或文件以错误模式打开 (微焦点)

您的最终记录将在预期之前“完成”,在读取32字节之前检测到文件结尾

请注意,错误出现在输入文件上,而不是输出文件上

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

注意Emmad Kareem的评论。使用
文件状态
。检查每个IO后的文件状态字段(为每个文件定义一个),以便知道何时出现问题以及问题是什么

测试th
   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.