tem_file_to_string Subroutine

public subroutine tem_file_to_string(funit, string, iError)

Read a file from a connected unit into a string.

The connected file has to be opened for sequential formatted access. A string will be returned containing the characters read from the file. If there are potential problems arising, they are returned in the error code iError

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: funit

File unit to read, has to be opened sequential and formatted.

character(len=*), intent(out) :: string

String to fill with the content of the file.

integer, intent(out) :: iError

Error code:

0 = no error 1 = end of string reached before end of file 2 = Unit not connected


Source Code

  subroutine tem_file_to_string(funit, string, iError)
    ! ---------------------------------------------------------------------------
    !> File unit to read, has to be opened sequential and formatted.
    integer, intent(in) :: funit
    !> String to fill with the content of the file.
    character(len=*), intent(out) :: string
    !> Error code:
    !!
    !! 0 = no error
    !! 1 = end of string reached before end of file
    !! 2 = Unit not connected
    integer, intent(out) :: iError
    ! ---------------------------------------------------------------------------
    integer :: old_pos, length
    integer :: stringlen
    integer :: io
    logical :: nUnitOpened
    character(len=PathLen) :: loc_string
    ! ---------------------------------------------------------------------------
    string = ''
    stringlen = len(string)
    iError = 2
    inquire(unit=funit, opened=nUnitOpened)
    if (nUnitOpened) then
      ! Go to the start of the file.
      rewind(funit)
      old_pos = 0
      do
        ! Read all contents of the scratch file until eof is encountered
        read(funit, '(a)', iostat=io) loc_string
        if (io == 0) then
          length = len_trim(loc_string)+1
          ! Only proceed, if the line still fits into the string
          if (old_pos+length > stringlen) then
            string(old_pos+1:) = loc_string(:stringlen-old_pos-length+1)
            iError = 1
            EXIT
          end if
          string(old_pos+1:old_pos+length) = trim(loc_string)//new_line('A')
          old_pos = old_pos+length
        else
          ! Reached end of the file, exit the loop.
          iError = 0
          EXIT
        end if
      end do
    end if

  end subroutine tem_file_to_string