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. |
Read line (record) from a connected unit.
The line is read as an ascii stream read until the eor is reached.
access='stream'
is supported with new_line as line terminator.Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
type(string), | public | :: | form_ | Format of unit, local variable. |
|||
integer, | public | :: | iostat_ | IO status code, local variable. |
|||
character(len=:), | public, | allocatable | :: | iomsg_ | IO status message, local variable. |
||
character(kind=CK,len=:), | public, | allocatable | :: | line | Line storage. |
||
character(kind=CK,len=1), | public | :: | ch | Character storage. |
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.
!---------------------------------------------------------------------------------------------------------------------------------
use, intrinsic :: iso_fortran_env, only : iostat_eor
!---------------------------------------------------------------------------------------------------------------------------------
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_
return
!---------------------------------------------------------------------------------------------------------------------------------
endsubroutine read_line