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