Print

Print


Hello

I have a question about unformatted sequential file input/output.

I was hoping that I might be able to write a dummy integer to file, then
write a load of records, then use REWIND to go back to the beginning of
the file, and then overwrite the dummy integer with the number of
records written before closing the file.

However, it appears that when I try to read the data back in again, I
can't get past the first integer without hitting an end of file.

Does this mean that an end of file marker is placed at the end of
whatever is the last write statement, effectively making what I was
trying to do with a sequential file impossible?

I have appended a small program demonstrating what I trying.

Thanks,

Paul

PROGRAM test_rewind_prog

    IMPLICIT NONE

    INTEGER, PARAMETER :: unit=20
    INTEGER :: record_1, record_2
    INTEGER :: n_records
    INTEGER :: dummy

    ! Initialise
    record_1=1
    record_1=2
    n_records=2
    dummy=0

    ! Write to file
    OPEN(&
       & UNIT=unit,&
       & FILE="test_rewind_prog.dat", &
       & FORM='UNFORMATTED',&
       & ACCESS='SEQUENTIAL',&
       & ACTION='WRITE',&
       & STATUS='REPLACE'&
       & )
    WRITE(UNIT=unit) dummy
    WRITE(UNIT=unit) record_1
    WRITE(UNIT=unit) record_2
    REWIND(UNIT=unit)
    WRITE(UNIT=unit) n_records
    CLOSE(UNIT=unit)

    ! Zero
    record_1=0
    record_1=0
    n_records=0

    ! Read from file
    OPEN(&
       & UNIT=unit,&
       & FILE="test_rewind_prog.dat", &
       & FORM='UNFORMATTED',&
       & ACCESS='SEQUENTIAL',&
       & ACTION='READ',&
       & STATUS='OLD'&
       & )
    READ(UNIT=unit) n_records
    ! Get an end of file error on this line
    READ(UNIT=unit) record_1
    READ(UNIT=unit) record_2
    CLOSE(UNIT=unit)

    ! Print to screen
    PRINT *,n_records,record_1,record_2

END PROGRAM test_rewind_prog