| FIX: Record Not Advanced If Branching to ERR= on READLast reviewed: September 16, 1997Article ID: Q75757 | 
| 5.00 5.10 | 5.00 5.10 MS-DOS | OS/2kbprg kbfixlist kbbuglist The information in this article applies to: 
 
 SYMPTOMSUnexpected or incorrect results may be generated while reading a file. 
 CAUSEWhen an error is encountered on a READ statement containing an ERR=label field, the program correctly branches to the error label, and the file pointer remains positioned after the point where the error occurred. Upon reading the file again, if any data remains on that record, the READ statement will fill variables with values from that record. Although this practice may at times appear unintuitive, the ANSI standard is unclear about where the file pointer should be positioned following an error branching on the READ statement. However, if no variables remain on a record in which an error is branched to upon a prior READ statement, when reading from the file again, the next variable is filled with a zero. See the sample code for more information. 
 RESOLUTIONForce the file pointer to advance to the next record. 
 STATUSMicrosoft has confirmed this to be a problem in Microsoft FORTRAN versions 5.0 and 5.1. This problem was corrected in FORTRAN PowerStation, version 1.0. 
 MORE INFORMATIONThe following code can be used to reproduce the problem with a test.dat of 
 1 2 3 a 5 6 7 8 9 10 Sample Code #1
        open(1,file='test.dat')
       do 10 j=1,10
         read(1,'(i3)',err=100,end=200) i
         print*,i
10     continuestop100 print*,'read error' goto 10200 end The above code produces the following results: 
           1
          2
          3
read error          0                  ! Not advancing to next record at this point
          5
          6
          7
          8
          9
         10
The following code forces the file pointer to advance to the next record
when an error is encountered during a READ statement:
 Sample Code #2
           open(1,file='test.dat')
          do 10 j=1,10
            read(1,'(i3)',err=100,end=200) i
            print*,i
   10     continue
          stop
  100     print*,'read error'
          read(1,*) ! advance to next record
          goto 10
  200     end
The output for the above code is as follows:
           1
          2
          3
read error          5
          6
          7
          8
          9
         10
 | 
| Additional reference words: 5.00 5.10 buglist5.00 buglist5.10 fixlist1.00 
 © 1998 Microsoft Corporation. All rights reserved. Terms of Use. |