当我尝试将输出写入文件时,我在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
答案 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;改变到记录的结尾。