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