Read and write text files in Modern Fortran

Utpal Kumar   3 minute read      

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