COBOL:当文件结尾和垃圾值都有返回码10时,如何区分它们?

COBOL:当文件结尾和垃圾值都有返回码10时,如何区分它们?,cobol,Cobol,我正在使用Fujitsu COBOL,在这种情况下,我必须读取文件,如果有垃圾值,那么我想中止作业 当存在垃圾值时,返回代码为10,但问题是当存在EOF文件结尾时,返回代码为10 请帮助我如何根据返回代码区分这两个事件?在下面的代码中,我刚刚展示了一种在文件状态代码均为10时区分文件结束和垃圾值的方法 在程序中,正在读取一个文件。正在读取的输入文件的文件状态为WS-ST。记录布局只有一个名为NAME1的字段。我不确定您的案例中的垃圾值是如何导致文件状态为10的。但是,为了重现您面临的错误,我将1

我正在使用Fujitsu COBOL,在这种情况下,我必须读取文件,如果有垃圾值,那么我想中止作业

当存在垃圾值时,返回代码为10,但问题是当存在EOF文件结尾时,返回代码为10


请帮助我如何根据返回代码区分这两个事件?

在下面的代码中,我刚刚展示了一种在文件状态代码均为10时区分文件结束和垃圾值的方法

在程序中,正在读取一个文件。正在读取的输入文件的文件状态为WS-ST。记录布局只有一个名为NAME1的字段。我不确定您的案例中的垃圾值是如何导致文件状态为10的。但是,为了重现您面临的错误,我将10移到了WS-ST,只要NAME1字段将SRINIVASAN作为值。我也打破了阅读循环,当NAME1拥有SRINIVASAN时

读取循环后,将检查文件状态数据项。如果它保持10,则发出另一次读取。在这里,我刚刚看到文件状态46

46-在输入或I-O模式下打开的文件上尝试了顺序读取操作,但未建立有效的下一条记录

处理文件状态46真正让您知道文件是否真的到达了它的末尾。通过这种方式,您当然可以区分EOF和垃圾价值。请通读这个答案底部的例子,你可能会明白一些

ID DIVISION.                                        
PROGRAM-ID. EOF1.                                   

ENVIRONMENT DIVISION.                               
INPUT-OUTPUT SECTION.                               
FILE-CONTROL.                                       
    SELECT INDD ASSIGN TO INDD                      
    FILE STATUS IS WS-ST.                           

DATA DIVISION.                                      
FILE SECTION.                                       
FD INDD.                                            
01 NAME1 PIC X(10).                                 
WORKING-STORAGE SECTION.                            
01 WS-ST   PIC 9(2) VALUE 0.                        
01 WS-READ PIC 9(2) VALUE 0.                        
01 WS-SWITCHES.                                     
   05 INDD-END    PIC X(1) VALUE 'N'.               
      88 INDD-EOF          VALUE 'Y'.               

PROCEDURE DIVISION.                                 
    OPEN INPUT INDD.                                
    PERFORM 100-READ THRU 100-EXIT UNTIL INDD-EOF.  
    IF WS-ST EQUAL 10                               
    READ INDD                                       
    DISPLAY 'READ FILE STATUS: ' WS-ST              
       IF WS-ST EQUAL 46                            
       DISPLAY 'END OF FILE'                        
       ELSE                                         
       DISPLAY 'RECORD' WS-READ ' IS ERRORED!'      
       MOVE 16 TO RETURN-CODE                       
       CLOSE INDD                                   
       STOP RUN                                     
       END-IF                                       
    ELSE                                            
    ADD 1 TO WS-READ                                
    END-IF.                                         
    CLOSE INDD.                                     
    STOP RUN.                                       

 100-READ.                                          
    READ INDD                                       
    AT END                                          
    SET INDD-EOF TO TRUE                            
    GO TO 100-EXIT                                  
    END-READ.                                       
    ADD 1 TO WS-READ.                               
    DISPLAY 'READ FILE STATUS: ' WS-ST.             
    DISPLAY 'RECORD' WS-READ ': ' NAME1.            
    IF NAME1 EQUAL 'SRINIVASAN'                     
    MOVE 10 TO WS-ST                                
    SET INDD-EOF TO TRUE                            
    END-IF.                                         
 100-EXIT. EXIT.
输入和输出的几个示例如下所示:

例1:

输入:第三条记录出错

***************************** Top of Data ******************************
BHUTAN                                                                  
NEPAL                                                                   
SRINIVASAN                                                              
**************************** Bottom of Data ****************************
********************************* TOP OF DATA **********************************
RECORD01: BHUTAN                                                                
RECORD02: SRINIVASAN                                                            
RECORD02 IS ERRORED!                                                            
******************************** BOTTOM OF DATA ********************************
输出:程序以RC 16结束。程序没有进一步阅读

********************************* TOP OF DATA **********************************
RECORD01: BHUTAN                                                                
RECORD02: NEPAL                                                                 
RECORD03: SRINIVASAN                                                            
RECORD03 IS ERRORED!                                                            
******************************** BOTTOM OF DATA ********************************
例2:

输入:这次没有错误记录

***************************** Top of Data ******************************
BHUTAN                                                                  
NEPAL                                                                   
**************************** Bottom of Data ****************************
输出:程序正常结束。RC 00

********************************* TOP OF DATA **********************************
RECORD01: BHUTAN                                                                
RECORD02: NEPAL                                                                 
END OF FILE                                                                     
******************************** BOTTOM OF DATA ********************************
例3:

输入:错误记录SRINIVASAN位于不丹和尼泊尔之间。可能在这两个国家之间的边界:

***************************** Top of Data ******************************
BHUTAN                                                                  
SRINIVASAN                                                              
NEPAL                                                                   
**************************** Bottom of Data ****************************
输出:程序以RC 16结束。程序没有读取第三条记录,因为第二条记录出错

***************************** Top of Data ******************************
BHUTAN                                                                  
NEPAL                                                                   
SRINIVASAN                                                              
**************************** Bottom of Data ****************************
********************************* TOP OF DATA **********************************
RECORD01: BHUTAN                                                                
RECORD02: SRINIVASAN                                                            
RECORD02 IS ERRORED!                                                            
******************************** BOTTOM OF DATA ********************************
例4:

输入:空输入文件

输出:程序正常结束

********************************* TOP OF DATA **********************************
END OF FILE                                                                     
******************************** BOTTOM OF DATA ********************************

希望这有帮助

在下面的代码中,我刚刚展示了一种在文件状态代码为10时区分文件结束值和垃圾值的方法

在程序中,正在读取一个文件。正在读取的输入文件的文件状态为WS-ST。记录布局只有一个名为NAME1的字段。我不确定您的案例中的垃圾值是如何导致文件状态为10的。但是,为了重现您面临的错误,我将10移到了WS-ST,只要NAME1字段将SRINIVASAN作为值。我也打破了阅读循环,当NAME1拥有SRINIVASAN时

读取循环后,将检查文件状态数据项。如果它保持10,则发出另一次读取。在这里,我刚刚看到文件状态46

46-在输入或I-O模式下打开的文件上尝试了顺序读取操作,但未建立有效的下一条记录

处理文件状态46真正让您知道文件是否真的到达了它的末尾。通过这种方式,您当然可以区分EOF和垃圾价值。请通读这个答案底部的例子,你可能会明白一些

ID DIVISION.                                        
PROGRAM-ID. EOF1.                                   

ENVIRONMENT DIVISION.                               
INPUT-OUTPUT SECTION.                               
FILE-CONTROL.                                       
    SELECT INDD ASSIGN TO INDD                      
    FILE STATUS IS WS-ST.                           

DATA DIVISION.                                      
FILE SECTION.                                       
FD INDD.                                            
01 NAME1 PIC X(10).                                 
WORKING-STORAGE SECTION.                            
01 WS-ST   PIC 9(2) VALUE 0.                        
01 WS-READ PIC 9(2) VALUE 0.                        
01 WS-SWITCHES.                                     
   05 INDD-END    PIC X(1) VALUE 'N'.               
      88 INDD-EOF          VALUE 'Y'.               

PROCEDURE DIVISION.                                 
    OPEN INPUT INDD.                                
    PERFORM 100-READ THRU 100-EXIT UNTIL INDD-EOF.  
    IF WS-ST EQUAL 10                               
    READ INDD                                       
    DISPLAY 'READ FILE STATUS: ' WS-ST              
       IF WS-ST EQUAL 46                            
       DISPLAY 'END OF FILE'                        
       ELSE                                         
       DISPLAY 'RECORD' WS-READ ' IS ERRORED!'      
       MOVE 16 TO RETURN-CODE                       
       CLOSE INDD                                   
       STOP RUN                                     
       END-IF                                       
    ELSE                                            
    ADD 1 TO WS-READ                                
    END-IF.                                         
    CLOSE INDD.                                     
    STOP RUN.                                       

 100-READ.                                          
    READ INDD                                       
    AT END                                          
    SET INDD-EOF TO TRUE                            
    GO TO 100-EXIT                                  
    END-READ.                                       
    ADD 1 TO WS-READ.                               
    DISPLAY 'READ FILE STATUS: ' WS-ST.             
    DISPLAY 'RECORD' WS-READ ': ' NAME1.            
    IF NAME1 EQUAL 'SRINIVASAN'                     
    MOVE 10 TO WS-ST                                
    SET INDD-EOF TO TRUE                            
    END-IF.                                         
 100-EXIT. EXIT.
输入和输出的几个示例如下所示:

例1:

输入:第三条记录出错

***************************** Top of Data ******************************
BHUTAN                                                                  
NEPAL                                                                   
SRINIVASAN                                                              
**************************** Bottom of Data ****************************
********************************* TOP OF DATA **********************************
RECORD01: BHUTAN                                                                
RECORD02: SRINIVASAN                                                            
RECORD02 IS ERRORED!                                                            
******************************** BOTTOM OF DATA ********************************
输出:程序以RC 16结束。程序没有进一步阅读

********************************* TOP OF DATA **********************************
RECORD01: BHUTAN                                                                
RECORD02: NEPAL                                                                 
RECORD03: SRINIVASAN                                                            
RECORD03 IS ERRORED!                                                            
******************************** BOTTOM OF DATA ********************************
例2:

输入:这次没有错误记录

***************************** Top of Data ******************************
BHUTAN                                                                  
NEPAL                                                                   
**************************** Bottom of Data ****************************
输出:程序正常结束。RC 00

********************************* TOP OF DATA **********************************
RECORD01: BHUTAN                                                                
RECORD02: NEPAL                                                                 
END OF FILE                                                                     
******************************** BOTTOM OF DATA ********************************
例3:

输入:错误记录SRINIVASAN位于不丹和尼泊尔之间。可能在这两个国家之间的边界:

***************************** Top of Data ******************************
BHUTAN                                                                  
SRINIVASAN                                                              
NEPAL                                                                   
**************************** Bottom of Data ****************************
输出:程序以RC 16结束。程序没有读取第三条记录,因为第二条记录出错

***************************** Top of Data ******************************
BHUTAN                                                                  
NEPAL                                                                   
SRINIVASAN                                                              
**************************** Bottom of Data ****************************
********************************* TOP OF DATA **********************************
RECORD01: BHUTAN                                                                
RECORD02: SRINIVASAN                                                            
RECORD02 IS ERRORED!                                                            
******************************** BOTTOM OF DATA ********************************
例4:

输入:空输入文件

输出:程序正常结束

********************************* TOP OF DATA **********************************
END OF FILE                                                                     
******************************** BOTTOM OF DATA ********************************

希望这有帮助

在非常早期的PC MS-DOS1.0上,Ctrl+Z X1A用作文本文件的文件结尾。编译器可能会检测到该字符,并将其视为结束if文件,而不允许处理文件的其余部分

在OEM/DOS字符集中,X1A显示为右箭头。你在评论中提到了箭头。我创建了一个简短的文件,其中包含四条测试记录

原始文件:

Record1
Record2
Record3
Record4
我用X1A替换了3。在十六进制编辑器中,它显示为

请注意,x1A字符显示为向右箭头

A编写了一个未显示的程序来读取显示修改文件输出的文件

Record1
Record2
Record
0003 lines read
文件结尾出现在X1A上

以下程序可用于检查X1A并识别损坏记录的发生。。。以便[您]可以更正该文件

   program-id. ctrl-z.
   environment division.
   input-output section.
   file-control.
       select in-file assign "ctrl-z.txt"
           organization sequential
       .
   data division.
   file section.
   fd in-file.
   1 in-char pic x.
   working-storage section.
   1 line-count binary pic 9(4) value 0.
   1 msg-txt pic x(25) value "lines read".
     88 error-msg value "lines read before cntrl-z".
   1 eof-in-file-flag pic 9 value 0.
     88 eof-in-file value 1.
   procedure division.
   begin.
       open input in-file
       read in-file
           at end set eof-in-file to true
       end-read
       perform until eof-in-file
           evaluate in-char
           when x"0A"
               add 1 to line-count
           when x"1A"
               set error-msg to true
               set eof-in-file to true
               exit perform
           when other
               continue
           end-evaluate
           read in-file
               at end set eof-in-file to true
           end-read
       end-perform
       close in-file
       display line-count space msg-txt
       stop run
       .
   end program ctrl-z.
结果是:

0002 lines read before cntrl-z

在非常早期的PC MS-DOS1.0上,Ctrl+Z X1A用作文本文件的文件结尾。哟 ur编译器可能会检测到该字符,并将其视为end if文件,而不是允许处理文件的其余部分

在OEM/DOS字符集中,X1A显示为右箭头。你在评论中提到了箭头。我创建了一个简短的文件,其中包含四条测试记录

原始文件:

Record1
Record2
Record3
Record4
我用X1A替换了3。在十六进制编辑器中,它显示为

请注意,x1A字符显示为向右箭头

A编写了一个未显示的程序来读取显示修改文件输出的文件

Record1
Record2
Record
0003 lines read
文件结尾出现在X1A上

以下程序可用于检查X1A并识别损坏记录的发生。。。以便[您]可以更正该文件

   program-id. ctrl-z.
   environment division.
   input-output section.
   file-control.
       select in-file assign "ctrl-z.txt"
           organization sequential
       .
   data division.
   file section.
   fd in-file.
   1 in-char pic x.
   working-storage section.
   1 line-count binary pic 9(4) value 0.
   1 msg-txt pic x(25) value "lines read".
     88 error-msg value "lines read before cntrl-z".
   1 eof-in-file-flag pic 9 value 0.
     88 eof-in-file value 1.
   procedure division.
   begin.
       open input in-file
       read in-file
           at end set eof-in-file to true
       end-read
       perform until eof-in-file
           evaluate in-char
           when x"0A"
               add 1 to line-count
           when x"1A"
               set error-msg to true
               set eof-in-file to true
               exit perform
           when other
               continue
           end-evaluate
           read in-file
               at end set eof-in-file to true
           end-read
       end-perform
       close in-file
       display line-count space msg-txt
       stop run
       .
   end program ctrl-z.
结果是:

0002 lines read before cntrl-z

你好请添加更多关于“垃圾价值”的详细信息。它是一个字段,用于检查垃圾值吗?检测到垃圾值时,返回代码如何为10?它是用户设置的返回码吗?如果是这样,您不能将返回代码更改为其他值,比如11吗?谢谢。@SrinivasanJv:谢谢你的关注!在字母数字字段中接收到一个箭头。我们正在读取一个顺序文件,read语句在读取带有垃圾值的记录时将文件状态代码返回为10。它认为文件已结束并仅在那里停止处理,而留下所有未处理的记录。我想识别损坏的记录并中止程序,以便更正文件。不,我不能将代码设置为11或任何其他数字,因为这是COBOL在文件读取结束时返回的标准代码。文件记录是顺序的还是行顺序的?@SushantRawat Rick的答案中是否缺少任何内容?@RickSmith:我最近无法检查答案,因为我遇到了其他非常紧急的事情!很抱歉延迟回复。你的问题似乎回答了我的问题!谢谢你抽出时间。嗨!请添加更多关于“垃圾价值”的详细信息。它是一个字段,用于检查垃圾值吗?检测到垃圾值时,返回代码如何为10?它是用户设置的返回码吗?如果是这样,您不能将返回代码更改为其他值,比如11吗?谢谢。@SrinivasanJv:谢谢你的关注!在字母数字字段中接收到一个箭头。我们正在读取一个顺序文件,read语句在读取带有垃圾值的记录时将文件状态代码返回为10。它认为文件已结束并仅在那里停止处理,而留下所有未处理的记录。我想识别损坏的记录并中止程序,以便更正文件。不,我不能将代码设置为11或任何其他数字,因为这是COBOL在文件读取结束时返回的标准代码。文件记录是顺序的还是行顺序的?@SushantRawat Rick的答案中是否缺少任何内容?@RickSmith:我最近无法检查答案,因为我遇到了其他非常紧急的事情!很抱歉延迟回复。你的问题似乎回答了我的问题!谢谢你的时间。嗨,瑞克·史密斯!谢谢你提供的细节。我想知道垃圾值如何让文件状态数据项存储10。这不是垃圾值!运行时系统将X1A视为文件的结尾,因此将文件状态设置为10。将忽略该字符后面的所有数据。早期的系统使用固定的128字节块写入文本文件,因此,即使文本的最后一部分没有占用完整的块,X1A也会告诉程序停止读取。这很快被更改为使用文件名存储文件长度,但旧文件仍然存在。有些是从CP/M移植的,它比MS-DOS早了几年。有关使用Ctrl-Z标记文件结束的信息,请参阅。嗨,Rick Smith!谢谢你提供的细节。我想知道垃圾值如何让文件状态数据项存储10。这不是垃圾值!运行时系统将X1A视为文件的结尾,因此将文件状态设置为10。将忽略该字符后面的所有数据。早期的系统使用固定的128字节块写入文本文件,因此,即使文本的最后一部分没有占用完整的块,X1A也会告诉程序停止读取。这很快被更改为使用文件名存储文件长度,但旧文件仍然存在。有些是从CP/M移植的,它比MS-DOS早了几年。有关使用Ctrl-Z标记文件结束的信息,请参阅。