Read lines (records) from a connected-formatted unit.
Note
The connected unit is rewinded. At a successful exit current record is at eof, at the beginning otherwise.
The lines are returned as an array of strings that are read until the eof is reached. 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.
Note
There is no doctests, this being tested by means of read_file doctests.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | unit |
Logical unit. |
||
type(string), | intent(out), | allocatable | :: | lines(:) |
The lines. |
|
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_lines(unit, lines, form, iostat, iomsg) !< Read lines (records) from a connected-formatted unit. !< !< @note The connected unit is rewinded. At a successful exit current record is at eof, at the beginning otherwise. !< !< The lines are returned as an array of strings that are read until the eof is reached. !< 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. !< !< @note There is no doctests, this being tested by means of [[read_file]] doctests. integer, intent(in) :: unit !< Logical unit. type(string), intent(out), allocatable :: lines(:) !< The lines. 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=1) :: ch !< Character storage. integer :: l !< Counter. form_ = 'FORMATTED' ; if (present(form)) form_ = form ; form_ = form_%upper() iomsg_ = repeat(' ', 99) ; if (present(iomsg)) iomsg_ = iomsg rewind(unit) select case(form_%chars()) case('FORMATTED') l = 0 do read(unit, *, err=10, end=10) l = l + 1 enddo case('UNFORMATTED') l = 0 do read(unit, err=10, end=10) ch if (ch==new_line('a')) l = l + 1 enddo endselect 10 rewind(unit) if (l>0) then allocate(lines(1:l)) l = 1 iostat_ = 0 do call lines(l)%read_line(unit=unit, form=form, iostat=iostat_, iomsg=iomsg_) if ((iostat_/=0.and..not.is_iostat_eor(iostat_)).or.(l>=size(lines, dim=1))) then exit endif l = l + 1 enddo endif if (present(iostat)) iostat = iostat_ if (present(iomsg)) iomsg = iomsg_ endsubroutine read_lines