cobol - 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 接受您定义的数字数据。因此,对于“文本数据”(只要它不是 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.
推荐阅读
- javascript - 重置无线电选择
- c++ - 带有模板成员的 C++ 类,它使用任意模板参数构造模板成员
- android - android - 屏幕截图显示黑色区域
- vb.net - 通过 httpwebrequest vb.net 检查 Instagram 用户
- sql - 选择上一年到当前日期
- arrays - Nodejs - FindOneAndUpdate 方法有效,但使我的网站在 events.js 上崩溃(使用 mongo)
- python - Python:更快的标准化
- node.js - 画布背景无意中浮现
- java - 如何使用 LocalSocket 修复“MediaRecorder.start()”上的“java.lang.IllegalStateException”
- css - 将 CSS 文件从 React index.html 链接到 Flask 后端