Using backspace when reading an unformatted file after a read error does not
work except if it is on the first record.
The code below show the problem. This code write 3 couples of integer values in
an unformatted file called 'foo' and close it.
File is reopen for read.
Then it reads the first couple of values. It's OK.
Then it try to read 3 values and detects the error (only 2 values in the
record).
The code use backspace to go back at the begining of this record and try to
read again this record, but with only 2 values.
The values obtained are wrong.
Trying to read 3 values at the begining of the file, using backspace and
reading again only 2 values works.
Code:
PROGRAM gfort
IMPLICIT NONE
INTEGER :: x, z, count
INTEGER :: nx, nz,LocalTimeStep
OPEN (21,FILE='foo',form='UNFORMATTED',err=101)
REWIND(21)
x=140
z=170
WRITE(21) x,z
WRITE(6,*)'writing x (',x,') and z(',z,') in foo'
x=14
z=17
WRITE(21) x,z
WRITE(6,*)'writing x (',x,') and z(',z,') in foo'
x=1400
z=1700
WRITE(21) x,z
WRITE(6,*)'writing x (',x,') and z(',z,') in foo'
CLOSE(21)
OPEN (21,FILE='foo',form='UNFORMATTED',status='OLD',err=101)
REWIND(21)
WRITE(6,*)'reading first x, z in foo'
x=-1
z=-1
READ(21,err=103,end=103) x,z
WRITE(6,*)'x (',x,') and z(',z,')'
WRITE(6,*)'reading x, z and LocalTimeStep in foo'
nx=-1
nz=-1
READ(21,iostat=count) nx,nz,LocalTimeStep
WRITE(6,*)'x (',nx,') and z(',nz,') and LocalTimeStep(',
+ LocalTimeStep,')'
IF (count.NE.0) THEN
WRITE(6,*)'reading again x and z in foo'
BACKSPACE(21)
nx=-1
nz=-1
READ(21,err=103,end=103) nx,nz
LocalTimeStep=0.0
WRITE(6,*)'x (',nx,') and z(',nz,') and LocalTimeStep(',
+ LocalTimeStep,')'
ENDIF
CLOSE(21)
STOP 'OK'
101 WRITE(6,*) 'foo n''a pas ete trouve.'
STOP 'FAILED'
103 WRITE(6,*) 'Erreur de lecture'
CLOSE(21)
STOP 'FAILED'
END PROGRAM gfort
NORMAL RESULT:
./a.out
writing x ( 140 ) and z( 170 ) in foo
writing x ( 14 ) and z( 17 ) in foo
writing x ( 1400 ) and z( 1700 ) in foo
reading first x, z in foo
x ( 140 ) and z( 170 )
reading x, z and LocalTimeStep in foo
x ( 14 ) and z( 17 ) and LocalTimeStep( 0 )
reading again x and z in foo
x ( 14 ) and z( 17 ) and LocalTimeStep( 0 )
OK
Gfortran RESULT (WRONG) :
./a.out
writing x ( 140 ) and z( 170 ) in foo
writing x ( 14 ) and z( 17 ) in foo
writing x ( 1400 ) and z( 1700 ) in foo
reading first x, z in foo
x ( 140 ) and z( 170 )
reading x, z and LocalTimeStep in foo
x ( 14 ) and z( 17 ) and LocalTimeStep( 17 )
reading again x and z in foo
x ( 17 ) and z( 8 ) and LocalTimeStep( 0 )
STOP OK
--
Summary: backspace intrinsic is not working on an unformatted
file
Product: gcc
Version: 4.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: Patrick dot Begou at hmg dot inpg dot fr
GCC build triplet: gcc version 4.3.0 20070418 (experimental)
GCC target triplet: i386-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31618