Read and write text files in Modern Fortran
We will read and write text and numeric data into a file using modern fortran.
In this post, I will try to give you a quick look of the key basic concepts in modern Fortran so that we can write a simple text file using the Fortran completely. Then we will read the file using Fortran.
Basic fortran program
Let us write a program to print the area of a circle in your stdout (your terminal).
program maths
implicit none
real :: r, area
real, parameter :: pi = 4.*atan(1.)
r = 2.0
area = pi*r**2
print*,'The area of a circle of radius ',r,' is ',area
end program maths
Notice that I have defined a parameter using the trigonometric function atan
. The good thing about Fortran is that the mathematical functions are embedded into it.
Let us compile this code and run it:
gfortran -o circarea circarea.f90
./circarea
This returns:
The area of a circle of radius 2.00000000 is 12.5663710
The results are correct but as you may have noticed that the output is not formatted properly. So, let us fix that.
program maths
implicit none
real :: r, area
real, parameter :: pi = 4.*atan(1.)
r = 2.0
area = pi*r**2
write(*,1) 'The area of a circle of radius ',r,' is ',area
1 format(A,F3.1,A,F5.2)
end program maths
This time we have used the write
to output the result instead of print
. You can also notice that we used the format to properly format the output:
The area of a circle of radius 2.0 is 12.57
Fortran format descriptors
Descriptor | Description | Example |
---|---|---|
I | integer output | print "(3i5)", i, j, k repeat i5 three times |
F | real number output | print "(2f12.3)",val1, val2 repeat 12 field width twice with precision 3 |
E | real output in exponential notation | print "(e10.3)",123456.0 gives ‘0.123e+06’ |
A | character output | print "(2a)", 'earthinversion' gives ‘earthinversionearthinversion’ |
X | space output | print "(a,2X,a)", 'earthinversion', 'earthinversion' gives ‘earthinversion earthinversion’ |
/ | insert blank lines | print "(a,/,a)", str, str |
Writing to a file
Writing and later you will see that the “reading” is about using the open
, close
, write
and read
statements.
program maths
implicit none
real :: r, area
real, parameter :: pi = 4.*atan(1.)
r = 2.0
area = pi*r**2
! write to ascii file
open(unit=1,file='results.out',status='replace',form='formatted')
write(1,11) 'The area of a circle of radius ',r,' is ',area
11 format(A,F3.1,A,F5.2)
close(1)
end program maths
Reading from the file
program maths
implicit none
real :: r, area
real, parameter :: pi = 4.*atan(1.)
character(len=20) :: filename
character(len = 45) :: str1
r = 2.0
area = pi*r**2
filename='results.out'
! write to ascii file
open(unit=1,file=filename,status='replace',form='formatted') !rewrite the file if exists
write(1,11) 'The area of a circle of radius ',r,' is ',area
11 format(A,F3.1,A,F5.2)
close(1)
! read from ascii file
open(unit=2,file=filename,status='old') !read from the existing file
read(2,*) str1
close(2)
write(*,*) str1
end program maths
This program writes a string into a file ‘results.out’ and then read it back into a string named str1
. Notice that we have defined the length of the string long enough (45 chars) to read all the string data.
Read and write the numeric data into a file
This time instead of writing it as a string, we will only write the numeric data into the file and read those data back into another variables.
program maths
implicit none
real :: r, area
real :: r_rd, area_rd
real, parameter :: pi = 4.*atan(1.)
character(len=20) :: filename
r = 2.0
area = pi*r**2
filename='results.out'
! write to ascii file
open(unit=1,file=filename,status='replace',form='formatted') !rewrite the file if exists
write(1,11) r,area
11 format(F3.1,F5.2)
close(1)
! read from ascii file
open(unit=2,file=filename,status='old') !read from the existing file
read(2,11) r_rd, area_rd
close(2)
write(*,12) r_rd, area_rd
12 format(F3.1,2X,F5.2)
end program maths
Disclaimer of liability
The information provided by the Earth Inversion is made available for educational purposes only.
Whilst we endeavor to keep the information up-to-date and correct. Earth Inversion makes no representations or warranties of any kind, express or implied about the completeness, accuracy, reliability, suitability or availability with respect to the website or the information, products, services or related graphics content on the website for any purpose.
UNDER NO CIRCUMSTANCE SHALL WE HAVE ANY LIABILITY TO YOU FOR ANY LOSS OR DAMAGE OF ANY KIND INCURRED AS A RESULT OF THE USE OF THE SITE OR RELIANCE ON ANY INFORMATION PROVIDED ON THE SITE. ANY RELIANCE YOU PLACED ON SUCH MATERIAL IS THEREFORE STRICTLY AT YOUR OWN RISK.
Leave a comment