我的COBOL作业再次出现问题。我认为一切都是假设的,但由于某种原因,我在运行程序时无法获得任何输出数据。它只是显示空白行,就像有人只是一遍又一遍地按下回车键。它真的很糟糕,因为我无法看出我是对还是错。这是我的代码:
WORKING-STORAGE SECTION.
01 ARE-THERE-MORE-RECORDS PIC X(3) VALUE 'YES'.
01 LINE-COUNT PIC 99 VALUE ZEROS.
01 WS-DATE.
05 RUN-YEAR PIC XX.
05 RUN-MONTH PIC XX.
05 RUN-DAY PIC XX.
01 HEADING-LINE-1.
05 PIC X(24) VALUE SPACES.
05 PIC X(26)
VALUE 'BASEBALL PLAYER STATISTICS'.
05 PIC X(12) VALUE SPACES.
05 HL-1-DATE.
10 MONTH-2 PIC XX.
10 PIC X VALUE '/'.
10 DAY-2 PIC XX.
10 PIC X VALUE '/'.
10 YEAR-2 PIC XX.
05 PIC X(6) VALUE SPACES.
05 PAGE-1 PIC X(4) VALUE 'PAGE'.
01 HEADING-LINE-2.
05 PIC X(6) VALUE 'LEAGUE'.
05 PIC X(3) VALUE SPACES.
05 PIC X(4) VALUE 'TEAM'.
05 PIC X(5) VALUE SPACES.
05 PIC X(4) VALUE 'NAME'.
05 PIC X(10) VALUE SPACES.
05 PIC X(4) VALUE 'HITS'.
05 PIC X(6) VALUE SPACES.
05 PIC X(7) VALUE 'AT BATS'.
01 DETAIL-LINE.
05 BLANK-A-OUT PIC X VALUE SPACES.
05 DL-LEAGUE PIC XX.
05 BLANK-B-OUT PIC X(3) VALUE SPACES.
05 DL-TEAM PIC X(3).
05 BLANK-C-OUT PIC X(3) VALUE SPACES.
05 DL-NAME PIC X(10).
05 BLANK-D-OUT PIC X(3) VALUE SPACES.
05 DL-HITS PIC ZZ9.
05 BLANK-E-OUT PIC X(3) VALUE SPACES.
05 DL-AT-BATS PIC ZZ9.
PROCEDURE DIVISION.
100-MAIN.
OPEN INPUT BASEBALL-FILE-IN
OPEN OUTPUT BASEBALL-FILE-OUT
ACCEPT WS-DATE FROM DATE
MOVE RUN-MONTH TO MONTH-2
MOVE RUN-DAY TO DAY-2
MOVE RUN-YEAR TO YEAR-2
WRITE BASEBALL-RECORD-OUT
PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
READ BASEBALL-FILE-IN
AT END
MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
NOT AT END
PERFORM 200-PROCESS-ONE-RECORD
END-READ
END-PERFORM
CLOSE BASEBALL-FILE-IN
CLOSE BASEBALL-FILE-OUT
STOP RUN.
200-PROCESS-ONE-RECORD.
MOVE LEAGUE-IN TO DL-LEAGUE
MOVE SPACES TO BLANK-A-OUT
MOVE TEAM-IN TO DL-TEAM
MOVE SPACES TO BLANK-B-OUT
MOVE NAME-IN TO DL-NAME
MOVE SPACES TO BLANK-C-OUT
MOVE HITS-IN TO DL-HITS
MOVE SPACES TO BLANK-D-OUT
MOVE AT-BATS-IN TO DL-AT-BATS
MOVE SPACES TO BLANK-E-OUT
WRITE BASEBALL-RECORD-OUT
AFTER ADVANCING 2 LINES.
300-LINE.
IF LINE-COUNT >= 50
PERFORM 400-NEXT-PAGE
END-IF
WRITE BASEBALL-RECORD-OUT
AFTER ADVANCING 1 LINE
ADD 1 TO LINE-COUNT.
400-NEXT-PAGE.
WRITE BASEBALL-RECORD-OUT
AFTER ADVANCING PAGE
MOVE ZEROS TO LINE-COUNT.
答案 0 :(得分:3)
编码COBOL I / O操作时可能会使用几种不同的模式。我看到两个 程序中的不同模式。
模式1:
在FD条目下定义I / O记录布局。您已为输入文件执行此操作。 BASEBALL-RECORD-IN既可以作为文件I / O缓冲区,也可以作为完整的记录描述。
模式2:
定义虚拟FD记录缓冲区,然后在“工作存储”下创建其他详细记录定义。 你为输出记录做了这个。 BASEBALL-RECORD-OUT只是一个I / O缓冲区 详细记录布局使用三个不同的记录在Working Strorage下进行保护 布局:HEADING-LINE-1,HEADING-LINE-1和DETAIL-LINE。
有什么区别?
主要差异与每个记录何时可寻址以及如何读/写数据有关。
使用模式1时,仅分配一个记录缓冲区。这是记录 与文件的FD子句相关联。在你的情况下,这是36字节的BASEBALL-RECORD-IN 记录。在与其关联的文件已打开之后,此缓冲区可能无法寻址。尝试 访问此记录缓冲区(通过显式初始化,移动空间或任何其他引用)会 导致运行时错误(崩溃和烧毁)。在打开和READ之后,记录中有数据 与FD相关的缓冲区。由于此FD具有已定义的记录结构,您可以 在发出READ语句后立即引用其中的任何字段(例如NAME-IN)。
使用模式2时,在工作存储中声明单独的记录结构。这里有记录 HEADING-LINE-1,HEADING-LINE-2和DETAIL-LINE都可以寻址 当程序开始运行时 - 即使输出记录缓冲区BASEBALL-RECORD-OUT(相关联 在输出文件打开之后才能寻址到FD)。这里要记住的事情 是记录缓冲区BASEBALL-RECORD-OUT和Working之间没有“自动”连接 存储记录HEADING-LINE-1,HEADING-LINE-2和DETAIL-LINE - 你必须明确地从工作中移动数据 使用以下内容存储到记录缓冲区:
MOVE HEADING-LINE-1 TO BASEBALL-RECORD-OUT
WRITE BASEBALL-RECORD-OUT
在每次WRITE操作之前。或者,您可以从工作存储记录中写入:
WRITE BASEBALL-RECORD-OUT FROM HEADING-LINE-1
这只是上面所示MOVE / WRITE的糖衣方式。
这个解释应该让你清楚为什么READ直接将数据放入一个完全 用于参考的现场记录结构,但WRITE需要一些额外的MOVE。
这些是COBOL中可用的两种I / O模式。随着您对该语言的了解越来越多 其他模式也应该被曝光。
答案 1 :(得分:1)
您永远不会将从BASEBALL-2.SEQ读取的数据移动到用于编写BASEBALL-2.RPT的记录中。
您可以执行类似
的操作* WRITE THE HEADER INFO
MOVE HEADING-LINE-1 TO BASEBALL-RECORD-OUT
WRITE BASEBALL-RECORD-OUT
或
WRITE BASEBALL-RECORD-OUT FROM HEADING-LINE-1
同样,您可以编写详细信息行
* WRITE THE DETAIL
MOVE DETAIL-LINE TO BASEBALL-RECORD-OUT
WRITE BASEBALL-RECORD-OUT
答案 2 :(得分:0)
自从我触摸Cobol以来已经有一段时间了,但您可能不会更新BASEBALL-RECORD-OUT。
答案 3 :(得分:0)
在写入BASEBALL-RECORD-OUT之前,你必须将HEADING-LINE-1,HEADING-LINE-2和DETAIL-LINE移动到BASEBALL-RECORD-OUT。
答案 4 :(得分:0)
我看到有两段在代码中没有执行,因为它们没有执行并且在停止运行之下。输出到文件时可能省略了i-o-control条目,输出似乎写入文件而不是显示屏或打印机。这将取决于任何默认设置或任何外部分配或重定向的设置。