This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Stream-reading question


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


Tobias,


I now have this test case working! I will submit the patch to list in the next day or so. Thanks again for the example.

Regards,

Jerry


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]