首页 > 解决方案 > COBOL 如何实际接受数值?

问题描述

我在这里有一个非常简单的 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

解决方案


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

与其他所有语言一样:“永远不要相信输入数据”是我可以推荐的。例如:有人可以使用名称中带有UTF-8编码字符的文件运行该程序,然后它“看起来”正确,但代码的数据发生了意外的变化。对于 COBOL,诸如FUNCTION TEST-NUMVAL(inp)[忽略空格并允许小数点] 或IS NUMERIC(严格的类测试)之类的东西可能很有用。
例如,使用数据检查,您还可以跳过空行或前导/尾随额外数据(临时标尺、标题、摘要......)。

对于实际问题:
看起来您为程序提供了一个“通用”文本文件,但实际上您没有指定它,因此您的 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.

推荐阅读