For Programmers: Free Programming Magazines  


Home > Archive > Fortran > October 2004 > Reading an array from a text file into fortran









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Reading an array from a text file into fortran
Glyn Edwards

2004-10-22, 8:56 am

Hi, I have what I hope is a simple question

in fortran 95 is there a simple way to read in data of the following form
into an array?

N 2
M 4

1.2 3.4 5.6 7.8
9.0 2.3 6.5 8.7

Ideally I'd like to read in N, M (I can do that) allocate an array such
that it has dimensions a(N,M) and then read in the values below into
the array like

a(1,1) a(1,2) a(1,3) a(1,4)
a(2,1) a(2,2) a(2,3) a(2,4)

I can't see how best to set up a read statement to fill in the array when
I have to read in the value of M at run time.

Any thoughts

Thanks

Glyn
Michael Metcalf

2004-10-22, 8:56 am


"Glyn Edwards" <glynedwards@fastmail.fm> wrote in message
news:pan.2004.10.22.09.57.53.905655@fastmail.fm...
>
> Ideally I'd like to read in N, M (I can do that) allocate an array such
> that it has dimensions a(N,M) and then read in the values below into
> the array like
>

Well, that is perfectly straightforward. Since we have to assume that this
is a homework assignment, perhaps you could post your attempt for comment,
rather than have us do it for you.

Regards,

Mike


Glyn Edwards

2004-10-22, 8:56 am

On Fri, 22 Oct 2004 11:09:08 +0100, Michael Metcalf wrote:

> Well, that is perfectly straightforward. Since we have to assume that this
> is a homework assignment, perhaps you could post your attempt for comment,

Heh heh heh, unfortunately it isn't a homework assignment it is just an
extension that I'd like to make to a program I'm writing for my PhD.
However, I don't particularly want to spend lots of time on it.

Ideally I'd like to read in a line from the file and then parse through
this number by number. I'm not sure what the best way to do this is though
and I'd like to avoid hacked solutions. I can do it in perl very easily
but unfortunately I have to do it in fortran

Glyn

Glyn Edwards

2004-10-22, 8:56 am

On Fri, 22 Oct 2004 11:09:08 +0100, Michael Metcalf wrote:

> is a homework assignment, perhaps you could post your attempt for comment,


I'd like to do it like this

read(11, fmt=*) a(n,1:M)

But that doesn't work

Glyn

P.S. Still enjoying the homework comment, shows my level of Fortran really :-)

David Frank

2004-10-22, 8:56 am


"Glyn Edwards" <glynedwards@fastmail.fm> wrote in message
news:pan.2004.10.22.10.41.29.39207@fastmail.fm...
> On Fri, 22 Oct 2004 11:09:08 +0100, Michael Metcalf wrote:
>
>
> I'd like to do it like this
>
> read(11, fmt=*) a(n,1:M)
>
> But that doesn't work
>
> Glyn
>
> P.S. Still enjoying the homework comment, shows my level of Fortran really
> :-)
>


Your read doesnt specify the complete array, try read (11,*) a

Just to be sure list processing doesnt have problems with your file's format
I whipped up a test program below.

! ------------------------
program test
integer :: n, m
real,allocatable :: a(:,:)
character :: c
open (11,file='test.txt') ! create test file
write (11,'(a)') 'N 2', 'M 4', &
'1.2 3.4 5.6 7.8', '9.0 2.3 6.5 8.7'
rewind (11)

read (11,*) c,n, c,m ! input array dimensions
allocate ( a(n,m) )
read (11,*) a
write (*,*) a ! outputs: 1.2 3.4 5.6 7.8 9.0 2.3 6.5 8.7
end program


Glyn Edwards

2004-10-22, 8:56 am


>
> Your read doesnt specify the complete array, try read (11,*) a
>
> Just to be sure list processing doesnt have problems with your file's format
> I whipped up a test program below.

Many thanks your program does just what I was after. Coincidently I
managed to find the following way of reading it in as well, which still
reads in line by line. I didn't realise read could read across lines for a
2D array

do n=1,nn
read (11,fmt=*,iostat=ios) (array(n,m),m=1,mm)
end do

Thanks for all your help

Glyn
David Frank

2004-10-22, 8:56 am

Methinks you wanted the array organized a(m,n) instead of a(n,m)
but note it matters not if the complete array is read (11,*) a
all the data is input.

"Glyn Edwards" <glynedwards@fastmail.fm> wrote in message
news:pan.2004.10.22.11.56.37.611884@fastmail.fm...
>
> Many thanks your program does just what I was after. Coincidently I
> managed to find the following way of reading it in as well, which still
> reads in line by line. I didn't realise read could read across lines for a
> 2D array
>
> do n=1,nn
> read (11,fmt=*,iostat=ios) (array(n,m),m=1,mm)
> end do
>
> Thanks for all your help
>
> Glyn


On 2nd look my test program shud have allocated array a(m,n)
but no big deal, if you decide it isnt ordered the way you want,
you can reorder it with 1 statement, e.g. a(n,m) to a(m,n)

a = reshape( a, [m,n], [2,1] )


jan van oosterwijk

2004-10-22, 3:57 pm

Glyn Edwards <glynedwards@fastmail.fm> wrote in message news:<pan.2004.10.22.09.57.53.905655@fastmail.fm>...
> Hi, I have what I hope is a simple question
>
> in fortran 95 is there a simple way to read in data of the following form
> into an array?


Well ... let me be nice once.

program read_array
implicit NONE
integer :: i
integer :: N = 2 , M = 4
real, allocatable, dimension(:, :) :: a

open(11, file = "somefile_name" )

read(11, *) n, m !
allocate(a(n, m))

read(11, *) (a(i, :), i = 1, n)

print(*, "('>', 4F5.1)") (a(i, :), i = 1, n)

end program read_array

! produces :
> 1.2 3.4 5.6 7.8
> 9.0 2.3 6.5 8.7


> Ideally I'd like to read in N, M (I can do that) allocate an array such
> that it has dimensions a(N,M) and then read in the values below into
> the array like


> a(1,1) a(1,2) a(1,3) a(1,4)
> a(2,1) a(2,2) a(2,3) a(2,4)
>
> I can't see how best to set up a read statement to fill in the array when
> I have to read in the value of M at run time.


[JvO]
James Van Buskirk

2004-10-22, 3:57 pm

"David Frank" <dave_frank@hotmail.com> wrote in message
news:zi6ed.13827$1f.5151@tornado.tampabay.rr.com...

> read (11,*) a
> write (*,*) a ! outputs: 1.2 3.4 5.6 7.8 9.0 2.3 6.5 8.7


Your array is in transposed order, however. You could fix
this via:

a = reshape(a,shape(a),order=(/2,1/))

but it would likely be more efficient to read the elements into
the array in the desired order in the first place.

--
write(*,*) transfer((/17.392111325966148d0,6.5794487871554595D-85, &
6.0134700243160014d-154/),(/'x'/)); end


beliavsky@aol.com

2004-10-23, 3:56 am

Glyn Edwards <glynedwards@fastmail.fm> wrote in message news:<pan.2004.10.22.09.57.53.905655@fastmail.fm>...
> Hi, I have what I hope is a simple question
>
> in fortran 95 is there a simple way to read in data of the following form
> into an array?
>
> N 2
> M 4
>
> 1.2 3.4 5.6 7.8
> 9.0 2.3 6.5 8.7
>
> Ideally I'd like to read in N, M (I can do that) allocate an array such
> that it has dimensions a(N,M) and then read in the values below into
> the array like
>
> a(1,1) a(1,2) a(1,3) a(1,4)
> a(2,1) a(2,2) a(2,3) a(2,4)
>
> I can't see how best to set up a read statement to fill in the array when
> I have to read in the value of M at run time.


David Frank and JvO have answered your question. One thing to beware
of is that if you try to read 4 numbers from a line but there are
fewer than 4, the remaining numbers will be read from the next line. A
problem with the data file may be hidden in this way. To avoid this, I
usually read each line into a string using the "(a)" format and then
read the numbers from this string.
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com