file - File Constructor and File Derived TypeExperimental
Impure function.
file function constructs a file entity of file type, including some file operation methods.
ofile = file(filename [, mode])
filename: Shall be a character(len=*) scalar.
This argument is intent(in).
Contains the file name.
mode: Shall be a character(len=*) scalar.
This argument is intent(in) and optional.
Contains characters describing the way in which the file will be used (see stdlib_io:open). The available modes are:
| Character | Meaning |
|---|---|
'r' |
construct a file for reading (default) |
'w' |
construct a file for writing, truncating the file first |
'x' |
construct a file for exclusive creation, failing if the file already exists |
'a' |
construct a file for writing, appending to the end of the file if it exists |
'+' |
construct a file for updating (reading and writing) |
'b' |
binary mode |
't' |
text mode (default) |
The default mode is 'rt' (i.e. construct a file for reading a text file). The mode may include one of the four different methods for opening a file (i.e., 'r', 'w', 'x', and 'a'). These four methods can be associated with the character '+' to open the file for updating. In addition, it can be specified if the file should be handled as a binary file ('b') or a text file ('t').
Returns a file entity of file type, in which the following are defined:
type file
character(:), allocatable :: filename
character(3) :: mode
integer :: unit
integer :: lines
contains
procedure :: exist
procedure :: open
procedure :: countlines
procedure :: close
end type file
program demo_io_file_1
use forlab_io, only: file, disp
use stdlib_error, only: check
type(file) :: infile
infile = file('DP.txt', 'r')
call check(infile%exist(), msg="File not exist, "//infile%filename)
call infile%open()
call infile%countlines()
call disp(infile%lines, 'Linenumber in file is: ')
call infile%close() !! `infile` is closed, `infile%filename` is deallocated.
end program demo_io_file_1
program demo_io_file_2
use forlab_io, only: file, disp
use stdlib_error, only: check
type(file), allocatable :: infile
!! To create a `file` type scalar to read:
!!
!!```fortran
!! infile = file("somefile.txt") ! The default `mode` is "rt"
!! infile = file("somefile.txt", "r")
!!```
!!
!! To create a `file` type scalar to write:
!! infile = file("somefile.txt", "w")
!!
!! To append to the end of the file if it exists:
!!
!! infile = file("somefile.txt", "a")
infile = file('DP.txt', 'r')
call check(infile%exist(), msg="File not exist, "//infile%filename)
call infile%open()
call infile%countlines()
call disp(infile%lines, 'Linenumber in file is: ')
call infile%close() !! It is optional. `infile` is closed, `infile%filename` is deallocated.
deallocate(infile) !! `infile` is deallocated.
end program demo_io_file_2
file%existChecks the file is exist or not.
Experimental.
Impure function.
result = self % exist()
None.
Returns a logical scalar: the file exists as .true., the file does not exist as .false..
program demo_io_file_exist
use forlab_io, only: file
use stdlib_error, only: check
type(file), allocatable :: infile
infile = file("filename.txt", "r")
call check(infile%exist(), msg="File not exist: "//infile%filename)
deallocate(infile)
end program demo_io_file_exist
file%openOpen the file object.
Experimental.
Impure function.
call self % open()
None.
program demo_io_file_open
use forlab_io, only: file
use stdlib_error, only: check
type(file), allocatable :: infile
infile = file("filename.txt", "r")
call check(infile%exist(), msg="File not exist: "//infile%filename)
call infile%open() !! Open file operation
deallocate(infile)
end program demo_io_file_open
file%countlinesCounts the number of lines in a txt file, the number of file lines is stored in file%lines.
Experimental.
Impure function.
call self % countlines()
None.
program demo_io_file_countlines
use forlab_io, only: file, disp
type(file), allocatable :: infile
infile = file("filename.txt", "r")
call infile%countlines() !! Counts the number of lines in a txt file, the number of file lines is stored in `infile%lines`.
call disp(infile%lines, "The number of file lines : ")
deallocate(infile)
end program demo_io_file_countlines
file%closeCloses the file object, deallocate file%filename.
Experimental.
Impure function.
call self % close()
None.
program demo_io_file_close
use forlab_io, only: file, disp
type(file) :: infile
infile = file("filename.txt", "r")
call infile%open()
call infile%close() !! Closes the `infile` object, deallocate `infile%filename`.
end program demo_io_file_close
colorPrints a PS code at default output_unit.
Experimental.
Impure subroutine.
call color ( [string=achar(27) // '[0m'] )
string: Shall be a character(len=*) scalar.
This argument is intent(in) and optional.
The default value is achar(27) // '[0m'.
Prints a PS code at default output_unit.
program demo_io_color
use forlab_io, only: color
use forlab_color, only: red, green
character(len=*), parameter :: char = "It is Fortran Color: "
call color(green)
print *, char // 'green.'
print *, red // char // 'red.'
call color()
print *, char // "default."
end program demo_io_color
disp - display your dataExperimental
Impure subroutine.
Outputs a logical/integer/real/complex/character/string_type scalar or logical/integer/real/complex and rank-1/rank-2 array to the screen or a file unit.
call disp( A(i, j, 2, :, 1:10) [, header, unit, brief] ) !! `i, j, ...` can be determined by `do` loop.
For complex type, the output format is *(A25, 1X);
For other types, the output format is *(A12, 1X).
To prevent users from accidentally passing large-length arrays to disp, causing unnecessary io blockage:
1. If the brief argument is not specified, disp will print the brief array content with a length of 10*50 by default.
2. Specify brief=.true., disp will print the brief array content with a length of 5*5;
3. Specify brief=.false., disp will print all the contents of the array.
call disp([x, header, unit, brief])
x: Shall be a logical/integer/real/complex/string_type scalar or logical/integer/real/complex and rank-1/rank-2 array.
This argument is intent(in) and optional.
header: Shall be a character(len=*) scalar.
This argument is intent(in) and optional.
unit: Shall be an integer scalar linked to an IO stream.
This argument is intent(in) and optional.
brief: Shall be a logical scalar.
This argument is intent(in) and optional.
Controls an abridged version of the x object is printed.
The result is to print header and x on the screen (or another output unit/file) in this order.
If x is a rank-1/rank-2 array type, the dimension length information of the array will also be outputted.
If disp is not passed any arguments, a blank line is printed.
If the x is present and of real/complex type, the data will retain four significant decimal places, like (g0.4).
program demo_io_disp
use forlab_io, only: disp
real(8) :: r(2, 3)
complex :: c(2, 3), c_3d(2, 100, 20)
integer :: i(2, 3)
logical :: l(10, 10)
r = 1.; c = 1.; c_3d = 2.; i = 1; l = .true.
r(1, 1) = -1.e-11
r(1, 2) = -1.e10
c(2, 2) = (-1.e10,-1.e10)
c_3d(1,3,1) = (1000, 0.001)
c_3d(1,3,2) = (1.e4, 100.)
call disp('string', header='disp(string):')
call disp('It is a note.')
call disp()
call disp(r, header='disp(r):')
call disp(r(1,:), header='disp(r(1,:))')
call disp(c, header='disp(c):')
call disp(i, header='disp(i):')
call disp(l, header='disp(l):', brief=.true.)
call disp(c_3d(:,:,3), header='disp(c_3d(:,:,3)):', brief=.true.)
call disp(c_3d(2,:,:), header='disp(c_3d(2,:,:)):', brief=.true.)
end program demo_io_disp
Results:
disp(string):
string
It is a note.
disp(r):
[matrix size: 2×3]
-0.1000E-10 -0.1000E+11 1.000
1.000 1.000 1.000
disp(r(1,:))
[vector size: 3]
-0.1000E-10 -0.1000E+11 1.000
disp(c):
[matrix size: 2×3]
(1.000,0.000) (1.000,0.000) (1.000,0.000)
(1.000,0.000) (-0.1000E+11,-0.1000E+11) (1.000,0.000)
disp(i):
[matrix size: 2×3]
1 1 1
1 1 1
disp(l):
[matrix size: 10×10]
T T T ... T
T T T ... T
T T T ... T
: : : : :
T T T ... T
disp(c_3d(:,:,3)):
[matrix size: 2×100]
(2.000,0.000) (2.000,0.000) (2.000,0.000) ... (2.000,0.000)
(2.000,0.000) (2.000,0.000) (2.000,0.000) ... (2.000,0.000)
disp(c_3d(2,:,:)):
[matrix size: 100×20]
(2.000,0.000) (2.000,0.000) (2.000,0.000) ... (2.000,0.000)
(2.000,0.000) (2.000,0.000) (2.000,0.000) ... (2.000,0.000)
(2.000,0.000) (2.000,0.000) (2.000,0.000) ... (2.000,0.000)
: : : : :
(2.000,0.000) (2.000,0.000) (2.000,0.000) ... (2.000,0.000)
progress_barPrints a progress bar.
Experimental
Impure subroutine.
call progress_bar (iter, itermax [, step, symbol])
iter/itermax/step shall be the same kind.
iter: Shall be an integer scalar.
This argument is intent(in).
itermax: Shall be an integer scalar.
This argument is intent(in).
step: Shall be an integer scalar.
This argument is intent(in) and optional.
symbol: Shall be a character(len=*) scalar.
This argument is intent(in) and optional.
Prints a line of progress bar on the screen.
program demo_io_progress_bar
use forlab_io, only: progress_bar
use forlab_stats, only: randu
do i = 0, 100, 10
call progress_bar(i, 100)
call sleep(randu(1, 2))
end do
write(*,"(3A)",advance="no") char(13), "Calculation Done!", repeat(" ", 55)
end program demo_io_progress_bar
progress_percPrints a progress percentage message.
Experimental
Impure subroutine.
call progress_perc (iter, itermax [, prefix])
iter/itermax shall be the same kind.
iter: Shall be an integer scalar.
This argument is intent(in).
itermax: Shall be an integer scalar.
This argument is intent(in).
prefix: Shall be a character(len=*) scalar.
This argument is intent(in) and optional.
Prints a line of progress percentage on the screen.
program demo_io_progress_perc
use forlab_io, only: progress_perc
use forlab_stats, only: randu
do i = 0, 100, 10
call progress_perc(i, 100, ">>")
call sleep(randu(1, 3))
end do
end program demo_io_progress_perc