COBOL 实际上如何接受数值?

How does COBOL actually accept numeric values?

我这里有一个非常简单的 COBOL 代码,它具有给定的输入数据和输出数据。问题是,它在第​​ 60 行显示错误,即 MOVE STUD-AGE TO AGE-OUT.,每次我 运行 OpenCOBOLIDE,我总是得到错误:

libcob: test.cob: 60: 'STUD-AGE' not numeric: '  '
WARNING - Implicit CLOSE of STUDENT-OUT ('C:\STUD-OUT.DAT')
WARNING - Implicit CLOSE of STUDENT-IN ('C:\STUD-IN.DAT')

而且我不知道它到底出了什么问题。这里应该是我创建的输入文件:

----5---10---15---20---25---30---35---40--
00-123345 ALISON MARTIN WOLF       1912056
00-789012 KEN DENNIOS ROME         1914156
00-345678 JACK ADRIAN TOCKSIN      1622234
00-901234 EJHAYZ ALONEY            2045645
00-567890 CHARLES JOHN GUINNIVER   1813243
00-123457 JEAN MICHAEL YARTER      2034253

这是它的代码:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. SAMPLE.
   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
       SELECT STUDENT-IN ASSIGN TO "C:\STUD-IN.DAT".
       SELECT STUDENT-OUT ASSIGN TO "C:\STUD-OUT.DAT".
   DATA DIVISION.
   FILE SECTION.
   FD  STUDENT-IN.
   01  STUD-REC.
       02 STUD-NO PIC X(10).
       02 STUD-NAME PIC X(25).
       02 STUD-AGE PIC 99.
       02 STUD-ALLOWANCE PIC 999V99.
   FD  STUDENT-OUT.
   01  PRINT-REC PIC X(80).
   WORKING-STORAGE SECTION.
   01  HDG-1.
       02 FILLER PIC X(20) VALUE SPACES.
       02 FILLER PIC X(22) VALUE "WILLOW PARK UNIVERSITY".
       02 FILLER PIC X(14) VALUE " OF MADAGASCAR".
   01  HDG-2.
       02 FILLER PIC X(9) VALUE SPACES.
       02 FILLER PIC X(14) VALUE "STUDENT NUMBER".
       02 FILLER PIC X(8) VALUE SPACES.
       02 FILLER PIC X(12) VALUE "STUDENT NAME".
       02 FILLER PIC X(15) VALUE SPACES.
       02 FILLER PIC X(3) VALUE "AGE".
       02 FILLER PIC X(8) VALUE SPACES.
       02 FILLER PIC X(9) VALUE "ALLOWANCE".

   01  PRINT-LINE.
       02 FILLER PIC X(9) VALUE SPACES.
       02 SNO-OUT PIC X(10).
       02 FILLER PIC X(12) VALUE SPACES.
       02 SNAME-OUT PIC X(25).
       02 FILLER PIC X(2) VALUE SPACE.
       02 AGE-OUT PIC Z9.
       02 FILLER PIC X(9) VALUE SPACES.
       02 ALL-OUT PIC ZZZ.99.
   01  E-O-F PIC XXX VALUE "NO".
   PROCEDURE DIVISION.

       OPEN INPUT STUDENT-IN
         OUTPUT STUDENT-OUT.

       WRITE PRINT-REC FROM HDG-1 BEFORE 1 LINE.
       WRITE PRINT-REC FROM HDG-2 AFTER 2 LINES.
       MOVE SPACES TO PRINT-REC.
       WRITE PRINT-REC AFTER 1 LINE.

       PERFORM READ-RTN UNTIL E-O-F = "YES".
       PERFORM CLOSE-RTN.

   READ-RTN.
       READ STUDENT-IN AT END MOVE "YES" TO E-O-F.
       MOVE STUD-NO TO SNO-OUT.
       MOVE STUD-NAME TO SNAME-OUT.
       MOVE STUD-AGE TO AGE-OUT.
       MOVE STUD-ALLOWANCE TO ALL-OUT.

       WRITE PRINT-REC FROM PRINT-LINE AFTER 1 LINE.
       

   CLOSE-RTN.
       CLOSE STUDENT-IN, STUDENT-OUT.
       STOP RUN.

我想实现的只是正确输出文件,但错误只输入了HDG-1,然后其余为空白。

回答您的问题:COBOL 接受您定义的数字数据。 因此,对于“文本数据”(只要它不是 UTF-16 或其他多字节编码文件)PIC 99(表示“默认 USAGE DISPLAY 中的两位数字 - 因此每个数字一个字节)是非常好。

所有 其他语言一样:“永远不要相信输入数据”是我可以推荐的。例如:有人可以 运行 这个程序和一个文件,该文件在名称中保存了 UTF-8 编码字符,然后它“看起来”是正确的,但代码在其数据中发生了意想不到的变化。对于 COBOL,FUNCTION TEST-NUMVAL(inp) [忽略空格并允许 decimal-point] 或 IS NUMERIC(严格的 class 测试)可能很有用。
例如,使用 data-check 您还可以跳过空行或 leading/trailing 额外数据(临时标尺、标题、摘要...)。

针对实际问题:
看起来您为程序提供了一个“通用”文本文件,但您实际上没有指定它,因此您的 COBOL 实现使用默认值 SEQUENTIAL。由于缺少对输入数据的检查,您没有直接发现这一点。
使期望和代码保持一致:

       SELECT STUDENT-IN  ASSIGN TO "C:\STUD-IN.DAT"
                          ORGANIZATION IS LINE SEQUENTIAL.
       SELECT STUDENT-OUT ASSIGN TO "C:\STUD-OUT.DAT"
                          ORGANIZATION IS LINE SEQUENTIAL.