Quantcast Fortran95 datafile extraction help Text - Physics Forums Library

PDA

View Full Version : Fortran95 datafile extraction help


eth
Jul26-08, 01:18 PM
Hello,

I'm pretty new to fortran95 and i've run into a stuck point extracting data from a file, here's what's up:

I have a file test.dat that has 2 columns and variable number of rows (different experiments will yield different amounts of points). I want to put the data into a matrix of equivalent dimensions as the file, if possible. My main issue is that since I wont be able to know the number of rows in the datafile, the "read" command crashes the program at the end of the file-reading.

datafile looks like this, with around 50000 rows:

2 14.2000
1 17.9000
1 27.7000
2 28.8000
1 44.3500
2 43.5000
2 58.2500
1 58.3500
1 72.6700
2 72.6500


The fortran code I have right now looks like:


double precision datamatrix(200000,2)
open(unit=9,file='data/test.dat')
read(9,901) datamatrix
901 format(F10.4,F10.4)



I think i'm in need of a command that finds how many rows are in the textfile

help please! Thanks!

Dr Transport
Jul26-08, 01:37 PM
Look for an End of file (EOF) character.

My other suggestion is to use a while-loop.......

eth
Jul26-08, 02:52 PM
Look for an End of file (EOF) character.
eek, can someone offer further explanation?

My other suggestion is to use a while-loop.......
what should it be "while"ing for?


btw i'm using
gfortran
ubuntu 8.04

if anyone needed to know that...

Jeff Reid
Jul26-08, 03:33 PM
Read() has an optional 3rd parameter. Since not all Fortran compilers have while loops I used goto:


integer i,n

i = 0
100 i = i+1
read(9, 901, END=101) datamatrix[i,1],datamatrix[i,2]
901 format(F10.4,F10.4)
goto 100

101 n = i


or


integer i,n
integer sts

i = 0
100 i = i + 1
read(9, 901, IOSTS=sts) datamatrix[i,1],datamatrix[i,2]
901 format(F10.4,F10.4)
if(sts .NE. 0) goto 101
goto 100

101 n = i

Dr Transport
Jul26-08, 03:57 PM
While loops will go until you reach the exit condition and are the preferred way to read a file where you don't know how long it is, which is what you indicated in the original post.

as pseudo code

while (not end of file)
read line into matrix
end of while

in C++ it looks like


while ( x < 10 ) { // While x is less than 10
cout<< x <<endl;
x++; // Update x so the condition can be met eventually
}

eth
Jul27-08, 01:44 PM
Thanks all, I got it working. I was just missing the end= command.