Read line (record) from a connected unit.
The line is read as an ascii stream read until the eor is reached.
@note Note
For unformatted read only access='stream'
is supported with new_line as line terminator.
type(string) :: astring
type(string) :: line(3)
integer :: iostat
character(len=99) :: iomsg
integer :: scratch
integer :: l
logical :: test_passed(6)
line(1) = ' Hello World! '
line(2) = 'How are you? '
line(3) = ' All say: "Fine thanks"'
open(newunit=scratch, status='SCRATCH')
write(scratch, "(A)") line(1)%chars()
write(scratch, "(A)") line(2)%chars()
write(scratch, "(A)") line(3)%chars()
rewind(scratch)
l = 0
iostat = 0
do
l = l + 1
call astring%read_line(unit=scratch, iostat=iostat, iomsg=iomsg)
if (iostat/=0.and..not.is_iostat_eor(iostat)) then
exit
else
test_passed(l) = (astring==line(l))
endif
enddo
close(scratch)
open(newunit=scratch, status='SCRATCH', form='UNFORMATTED', access='STREAM')
write(scratch) line(1)%chars()//new_line('a')
write(scratch) line(2)%chars()//new_line('a')
write(scratch) line(3)%chars()//new_line('a')
rewind(scratch)
l = 0
iostat = 0
do
l = l + 1
call astring%read_line(unit=scratch, iostat=iostat, iomsg=iomsg, form='UnfORMatteD')
if (iostat/=0.and..not.is_iostat_eor(iostat)) then
exit
else
test_passed(l+3) = (astring==line(l))
endif
enddo
close(scratch)
print '(L1)', all(test_passed)
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(string), | intent(inout) | :: | self |
The string. |
||
integer, | intent(in) | :: | unit |
Logical unit. |
||
character(len=*), | intent(in), | optional | :: | form |
Format of unit. |
|
integer, | intent(out), | optional | :: | iostat |
IO status code. |
|
character(len=*), | intent(inout), | optional | :: | iomsg |
IO status message. |
subroutine read_line(self, unit, form, iostat, iomsg) !< Read line (record) from a connected unit. !< !< The line is read as an ascii stream read until the eor is reached. !< !< @note For unformatted read only `access='stream'` is supported with new_line as line terminator. !< !<```fortran !< type(string) :: astring !< type(string) :: line(3) !< integer :: iostat !< character(len=99) :: iomsg !< integer :: scratch !< integer :: l !< logical :: test_passed(6) !< line(1) = ' Hello World! ' !< line(2) = 'How are you? ' !< line(3) = ' All say: "Fine thanks"' !< open(newunit=scratch, status='SCRATCH') !< write(scratch, "(A)") line(1)%chars() !< write(scratch, "(A)") line(2)%chars() !< write(scratch, "(A)") line(3)%chars() !< rewind(scratch) !< l = 0 !< iostat = 0 !< do !< l = l + 1 !< call astring%read_line(unit=scratch, iostat=iostat, iomsg=iomsg) !< if (iostat/=0.and..not.is_iostat_eor(iostat)) then !< exit !< else !< test_passed(l) = (astring==line(l)) !< endif !< enddo !< close(scratch) !< open(newunit=scratch, status='SCRATCH', form='UNFORMATTED', access='STREAM') !< write(scratch) line(1)%chars()//new_line('a') !< write(scratch) line(2)%chars()//new_line('a') !< write(scratch) line(3)%chars()//new_line('a') !< rewind(scratch) !< l = 0 !< iostat = 0 !< do !< l = l + 1 !< call astring%read_line(unit=scratch, iostat=iostat, iomsg=iomsg, form='UnfORMatteD') !< if (iostat/=0.and..not.is_iostat_eor(iostat)) then !< exit !< else !< test_passed(l+3) = (astring==line(l)) !< endif !< enddo !< close(scratch) !< print '(L1)', all(test_passed) !<``` !=> T <<< class(string), intent(inout) :: self !< The string. integer, intent(in) :: unit !< Logical unit. character(len=*), intent(in), optional :: form !< Format of unit. integer, intent(out), optional :: iostat !< IO status code. character(len=*), intent(inout), optional :: iomsg !< IO status message. type(string) :: form_ !< Format of unit, local variable. integer :: iostat_ !< IO status code, local variable. character(len=:), allocatable :: iomsg_ !< IO status message, local variable. character(kind=CK, len=:), allocatable :: line !< Line storage. character(kind=CK, len=1) :: ch !< Character storage. form_ = 'FORMATTED' ; if (present(form)) form_ = form ; form_ = form_%upper() iomsg_ = repeat(' ', 99) ; if (present(iomsg)) iomsg_ = iomsg line = '' select case(form_%chars()) case('FORMATTED') do read(unit, "(A)", advance='no', iostat=iostat_, iomsg=iomsg_, err=10, end=10, eor=10) ch line = line//ch enddo case('UNFORMATTED') do read(unit, iostat=iostat_, iomsg=iomsg_, err=10, end=10) ch if (ch==new_line('a')) then iostat_ = iostat_eor exit endif line = line//ch enddo endselect 10 if (line/='') self%raw = line if (present(iostat)) iostat = iostat_ if (present(iomsg)) iomsg = iomsg_ endsubroutine read_line