Skip to main content

Read

This method reads data from a file into various Fortran data types, including scalars, vectors, and instances of IntVector_ and RealVector_.

  • We can read data from a file in a scalar variable of Integer, Real, String, Boolean, IntVector or RealVector type.
  • We can read data in a vector of Integer, Real, String, Boolean, IntVector, RealVector type.
  • We can read data in a matrix of Integer, Real, String.

Interface 1 (For reading scalar)

INTERFACE
MODULE SUBROUTINE READ (obj, val, iostat, iomsg, &
ignoreComment, ignoreBlank, commentSymbol, separator)
CLASS(TxtFile_), INTENT(INOUT) :: obj
DataType, INTENT(INOUT) :: val
INTEGER(I4B), INTENT(OUT) :: iostat
CHARACTER(LEN=*), OPTIONAL, INTENT(OUT) :: iomsg
LOGICAL(LGT), OPTIONAL, INTENT(IN) :: ignoreComment
LOGICAL(LGT), OPTIONAL, INTENT(IN) :: ignoreBlank
CHARACTER(len=1), OPTIONAL, INTENT(IN) :: commentSymbol
CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: separator
END SUBROUTINE READ
END INTERFACE
  • In above call, DataType can be any of the following:
    • INTEGER(Int8|Int16|Int32|Int64)
    • REAL(Real32|Real64)
    • LOGICAL(LGT)
    • STRING
    • INTVECTOR_
    • REALVECTOR_

Interface 2 (For reading vector)

INTERFACE
MODULE SUBROUTINE READ (obj, val, iostat, iomsg, &
ignoreComment, ignoreBlank, commentSymbol, separator)
CLASS(TxtFile_), INTENT(INOUT) :: obj
DataType, ALLOCATABLE, INTENT(INOUT) :: val(:)
INTEGER(I4B), OPTIONAL, INTENT(OUT) :: iostat
CHARACTER(LEN=*), OPTIONAL, INTENT(OUT) :: iomsg
LOGICAL(LGT), OPTIONAL, INTENT(IN) :: ignoreComment
LOGICAL(LGT), OPTIONAL, INTENT(IN) :: ignoreBlank
CHARACTER(len=1), OPTIONAL, INTENT(IN) :: commentSymbol
CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: separator
END SUBROUTINE READ
END INTERFACE
  • In above call, DataType can be any of the following:
    • INTEGER(Int8|Int16|Int32|Int64)
    • REAL(Real32|Real64)
    • LOGICAL(LGT)
    • STRING
    • INTVECTOR_
    • REALVECTOR_

Interface 3 (For reading matrix)

INTERFACE
MODULE SUBROUTINE txt_Read_mat_Int8(obj, val, iostat, iomsg, &
ignoreComment, ignoreBlank, commentSymbol, separator)
CLASS(TxtFile_), INTENT(INOUT) :: obj
DataType, ALLOCATABLE, INTENT(INOUT) :: val(:, :)
INTEGER(I4B), OPTIONAL, INTENT(OUT) :: iostat
CHARACTER(LEN=*), OPTIONAL, INTENT(OUT) :: iomsg
LOGICAL(LGT), OPTIONAL, INTENT(IN) :: ignoreComment
LOGICAL(LGT), OPTIONAL, INTENT(IN) :: ignoreBlank
CHARACTER(len=1), OPTIONAL, INTENT(IN) :: commentSymbol
CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: separator
END SUBROUTINE txt_Read_mat_Int8
END INTERFACE
  • In above call, DataType can be any of the following:
    • INTEGER(Int8|Int16|Int32|Int64)
    • REAL(Real32|Real64)
    • LOGICAL(LGT)
    • STRING

Example 1 (Reading scalar values)

This example shows the usage of Read methods to read a scalar.

! This example shows the usage of `Read` methods to read a scalar.
! We will read integre, real, and boolean value from a file

PROGRAM main
USE TxtFile_Class
USE String_Class
USE GlobalData
USE Test_Method
USE Display_Method
USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION

TYPE(TxtFile_) :: obj
TYPE(String) :: aline
INTEGER(I4B) :: int_r0, iostat
REAL(DFP) :: real_r0
LOGICAL(LGT) :: bool_r0
CHARACTER(len=*), PARAMETER :: filename = "./files/_Read_test_1.txt"

! Initiate an instance of [[TxtFile_]], and then
! Open the [[TxtFile_]] file

CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.)

CALL obj%Initiate(filename=filename, status='OLD', &
action='READ')
CALL obj%OPEN()

! Read the value in the integer.
int_r0 = 0
CALL obj%READ(val=int_r0, iostat=iostat)
CALL IS(int_r0, 1, "test read scalar integer")

! Read the value in the real.
real_r0 = 0
! CALL obj%REWIND()
CALL obj%READ(val=real_r0, iostat=iostat)
CALL IS(INT(real_r0, I4B), 2, "test read scalar real")

! Read the value in the boolean
bool_r0 = .FALSE.
! CALL obj%REWIND()
CALL obj%READ(val=bool_r0, iostat=iostat)
CALL IS(bool_r0, .TRUE., "test read scalar boolean")

! Read the value in the boolean
bool_r0 = .TRUE.
! CALL obj%REWIND()
CALL obj%READ(val=bool_r0, iostat=iostat)
CALL IS(bool_r0, .FALSE., "test read scalar boolean")

! Cleaning up.

CALL obj%DEALLOCATE()
END PROGRAM main

Example 2 (Reading vector values)

This example shows the usage of Read methods to read a vector.

! This example shows the usage of `Read`
! methods to read a vector of integer, real, and booleans.

PROGRAM main
USE TxtFile_Class
USE String_Class
USE GlobalData
USE Test_Method
USE Display_Method
USE BaseType, ONLY: IntVector_, RealVector_
USE ApproxUtility
USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION
USE IntVector_Method
USE RealVector_Method

CHARACTER(LEN=*), PARAMETER :: filename = "./files/_Read_test_2.txt"

INTEGER(I4B) :: ii
LOGICAL(LGT) :: isok
TYPE(TxtFile_) :: obj
TYPE(String) :: aline
TYPE(IntVector_) :: intvectorval
TYPE(RealVector_) :: realvectorval
INTEGER(I4B), ALLOCATABLE :: intval(:), iostat
REAL(DFP), ALLOCATABLE :: realval(:)
TYPE(String), ALLOCATABLE :: stringval(:)
LOGICAL(LGT), ALLOCATABLE :: boolval(:)

CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.)

! Initiate an instance of [[TxtFile_]], and then
! Open the [[TxtFile_]] file
CALL obj%Initiate(filename=filename, status='OLD', &
action='READ')
CALL obj%OPEN()

! Read the value in the integer.
CALL obj%READ(val=intval, iostat=iostat)
isok = ALL(intval .EQ. [1, 2, 3])
CALL OK(isok, "test read vector of integer")

! Read the value in the real.
CALL obj%REWIND()
CALL obj%READ(val=realval, iostat=iostat)
isok = ALL(realval.approxeq. [1.0_DFP, 2.0_DFP, 3.0_DFP])
CALL OK(isok, "test read vector of real")

! Read the value in the string.
CALL obj%REWIND()
CALL obj%READ(val=stringval, iostat=iostat)
isok = ALL(stringval .EQ. [String("1"), String("2"), String("3")])
CALL OK(isok, "test read vector of string")

! Read the value in an instance of [[IntVector_]]
CALL obj%REWIND()
CALL obj%READ(val=intvectorval, iostat=iostat)
isok = ALL(Get(intvectorval, 1_I4B) .EQ. [1, 2, 3])
CALL OK(isok, "test read IntVector_")

! Read the value in an instance of [[RealVector_]]
CALL obj%REWIND()
CALL obj%READ(val=realvectorval, iostat=iostat)
isok = ALL(Get(realvectorval, 1_I4B) .EQ. [1, 2, 3])
CALL OK(isok, "test read RealVector_")

! Read the value in vector of boolean
CALL obj%REWIND()
CALL obj%READ(val=boolval, iostat=iostat)
isok = ALL(boolval .EQV. [.TRUE., .FALSE., .FALSE.])
CALL OK(isok, "test read a vector of boolean")

! Cleaning up.
CALL obj%DEALLOCATE()
END PROGRAM main