首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从磁带读取可变长度记录返回0长度

从磁带读取可变长度记录返回0长度
EN

Stack Overflow用户
提问于 2020-05-05 08:54:04
回答 1查看 342关注 0票数 1

我有一个从UNIT=TAPE读取记录的COBOL程序

记录长度是可变长度。

我试图读取可变长度的记录,并将记录长度转换为变量,但得到的长度为零。

我的问题是我写的代码有什么问题

这是我的密码:

代码语言:javascript
复制
 IDENTIFICATION DIVISION.                                    
   PROGRAM-ID. TDCBLALC.                                       
   ENVIRONMENT DIVISION.                                       
   INPUT-OUTPUT SECTION.                                       
   FILE-CONTROL.                                               
       SELECT KOVETZ-SPOOL ASSIGN TO OTFILE                    
         ORGANIZATION IS SEQUENTIAL                            
         ACCESS  MODE IS SEQUENTIAL                            
         FILE STATUS IS SW-END.                                
   DATA DIVISION.                                              
   FILE SECTION.                                               
   FD  KOVETZ-SPOOL                                            
       LABEL RECORD IS STANDARD                                
       RECORD IS VARYING IN SIZE FROM 1 TO 12600               
       DEPENDING ON ORECH-S                                    
       RECORDING MODE IS V.                                    
    01  RESHUMAT-SPOOL             PIC X(12600).               
   WORKING-STORAGE SECTION.                                    
    01  ORECH-S           PIC 9(8) COMP.                       
    01 I                  PIC S9(4) VALUE 0.                   
    01 SW-END PIC 99.                                          
    01 FN PIC X(44).                                           
    01 WS-ALLOC-STRING PIC X(100).                             
    01 PGM PIC X(08) VALUE 'BPXWDYN'.                          
   PROCEDURE DIVISION.                                         
       MOVE 'LYTO.SPOOL.PISD0735.T1401803.M001.D1191030' TO FN.
       STRING 'ALLOC DD(OTFILE) DSN(' DELIMITED BY SIZE          
              FN DELIMITED BY SPACE                              
              ') SHR REUSE '                                     
              ' UNIT(TAPE) '                                     
               DELIMITED BY SIZE                                 
        INTO WS-ALLOC-STRING                                     
       END-STRING.                                               
       DISPLAY ' WS-ALLOC-STRING *' WS-ALLOC-STRING '*'          
       CALL PGM USING WS-ALLOC-STRING.                           
       DISPLAY 'ALLOC RC='RETURN-CODE.                           
       OPEN INPUT KOVETZ-SPOOL                                   
       DISPLAY 'OPEN RC='RETURN-CODE.                            
       MOVE 00 TO SW-END                                         
       READ KOVETZ-SPOOL                                         
            AT END MOVE 1 TO SW-END                              
       END-READ                                                  
       DISPLAY 'READ RC='RETURN-CODE' SW-END='SW-END             

       PERFORM UNTIL SW-END = 1 OR I > 100                       
            ADD 1 TO I                                           
            DISPLAY 'ORECH-S=' ORECH-S                           
            DISPLAY 'RESHUMAT-SPOOL=' RESHUMAT-SPOOL(1:100)      
             READ KOVETZ-SPOOL                                   
               AT END MOVE 1 TO SW-END                           
             END-READ                                            
            DISPLAY 'READ RC='RETURN-CODE' SW-END='SW-END        
       END-PERFORM           

        CLOSE KOVETZ-SPOOL   

       GOBACK. 

alloc=0的返回码

open=0的返回码

read=0的返回码

读取后的文件状态(SW-END)为47 (未打开的文件已尝试读取或启动操作,输入或I-O)。

我不知道为什么,我显式地打开文件输入

不管怎样,的问题依然存在。读取后的记录长度为零

ORECH-S=00000000

EN

回答 1

Stack Overflow用户

发布于 2020-05-05 17:32:40

简单的错误-您忘记声明工作-存储部分。

代码语言:javascript
复制
   IDENTIFICATION DIVISION.                       
   PROGRAM-ID. TDCBLALC.                          
   ENVIRONMENT DIVISION.                          
   INPUT-OUTPUT SECTION.                          
   FILE-CONTROL.                                  
       SELECT KOVETZ-SPOOL 
              ASSIGN TO OTFILE       
              ORGANIZATION IS SEQUENTIAL               
              FILE STATUS IS SW-END.                   

   DATA DIVISION.                                 
   FILE SECTION.                                  
   FD  KOVETZ-SPOOL                               
       LABEL RECORD IS STANDARD                                     
       RECORD IS VARYING IN SIZE FROM 1 TO 32600  
       DEPENDING ON ORECH-S                       
       RECORDING MODE IS V.                       
   01  RESHUMAT-SPOOL             PIC X(32600).

   WORKING-STORAGE SECTION.
   01  ORECH-S           PIC 9(8) COMP.     
   01 I                  PIC S9(4) VALUE 0. 
   01 SW-END PIC X(02).                     
   01 FN PIC X(44).                         
   01 WS-ALLOC-STRING PIC X(100).           
   01 PGM PIC X(08) VALUE 'BPXWDYN'.        

   PROCEDURE DIVISION.        
       MOVE 'LYTO.SPOOL.PISD0735.T1401803.M001.D1191030' TO FN.
       STRING 'ALLOC DD(OTFILE) DSN(' FN ') SHR REUSE '        
              ' UNIT(TAPE) '                                   
                   DELIMITED BY SIZE                                       
         INTO WS-ALLOC-STRING                                   
       END-STRING.   
       DISPLAY ' WS-ALLOC-STRING *' WS-ALLOC-STRING '*'        
       CALL PGM USING WS-ALLOC-STRING.                         
       DISPLAY RETURN-CODE.                                    
       OPEN INPUT KOVETZ-SPOOL                                 
       READ KOVETZ-SPOOL                                       
           AT END MOVE 1 TO SW-END                            
       END-READ   

       PERFORM UNTIL SW-END = 1 OR I > 100                   
           ADD 1 TO I                                       
           DISPLAY 'ORECH-S=' ORECH-S                       
           DISPLAY 'RESHUMAT-SPOOL=' RESHUMAT-SPOOL(1:100)  
           READ KOVETZ-SPOOL                               
             AT END MOVE 1 TO SW-END                       
           END-READ                                        
       END-PERFORM                                           

       CLOSE KOVETZ-SPOOL                                   

       GOBACK.

我使用GnuCobol编译并运行了这个程序,因此程序在语法和逻辑上都是正确的。我确实替换了一个本地文件,并注释掉了对BPXDYN的调用,因为我在Linux上运行它,而且该文件有一个Z/OS命名约定。

文件分配失败,所以打开的文件也会失败,但他从未检查过文件状态。读取返回'47‘,因为文件从未成功打开

程序输出如下: ALLOC DD(OTFILE) DSN(LYTO.SPOOL.PISD0735.T1401803.M001.D1191030 ) SHR重用单元(磁带)

您需要数据集名称周围的引号,否则系统会尝试在其前缀加上您的TSO ID。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61609330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档