Stream-reading question

Jerry DeLisle jvdelisle@verizon.net
Mon Oct 9 03:13:00 GMT 2006


Tobias Burnus wrote:
> Hi Jerry,
> 
> Jerry DeLisle wrote:
>> I agree with this and I will look into whats going on with formatted
>> stream.  I would suggest simplifying the test case for the NEWLINE()
>> intrinsic to avoid this problem and I will use the example you have
>> given here as a test case for the stream I/O fix.
> For new_line() I will use as suggested the simple achar(10) ==
> new_line('a') test.
> 
> I have a better(?) test case for stream, see below. The test case below
> works nicely with f95. g95 seems to have the same problems are gfortran,
> plus some of its own.
> 
> One of the tests has been adapted from
> http://groups.google.com/group/comp.lang.fortran/browse_thread/thread/8ad976f815df0fae/a2f51d975fa3a537
> 
> Tobias
> 
> program stream_test
>     implicit none
>     character(len=*), parameter :: rec1 = 'record1'
>     character(len=*), parameter :: rec2 = 'record2'
>     character(len=50) :: str1,str2
>     integer           :: len, i
>     real              :: r
> 
>     open(10,form='formatted',access='stream',&
>          status='scratch',position='rewind')
>     write(10,'(a)') rec1//new_line('a')//rec2
>     rewind(10)
>     read(10,*) str1
>     read(10,*) str2
>     if(str1 /= rec1 .or. str2 /= rec2) call abort()
>     rewind(10)
>     read(10,'(a)') str1
>     read(10,'(a)') str2
>     if(str1 /= rec1 .or. str2 /= rec2) call abort()
>     close(10)
> 
>     open(10,form='formatted',access='stream',&
>          status='scratch',position='rewind')
>     write(10,*) '123 '//trim(rec1)//'  1e-12'
>     write(10,*) '12345.6789'
>     rewind(10)
>     read(10,*) i,str1
>     read(10,*) r
>     if(i /= 123 .or. str1 /= rec1 .or. r /= 12345.6789) &
>       call abort()
>     close(10)
> 
>     open(unit=10,form='unformatted',access='stream', &
>          status='scratch',position='rewind')
>     write(10) rec1//new_line('a')//rec2
>     len = len_trim(rec1//new_line('a')//rec2)
>     rewind(10)
>     read(10) str1(1:len)
>     if(str1 /= rec1//new_line('a')//rec2) call abort()
> end program stream_test
> 
Thanks for the test case.  I have made this all part of pr29277.  I have posted 
a preliminary patch for the READ portion.  If someone could test this on a 
windows machine I would appreciate it.  I am now attending to the WRITE part.

Regards

Jerry



More information about the Fortran mailing list