Fortran Fortran read from file problems

  • Thread starter Thread starter thomsonm
  • Start date Start date
  • Tags Tags
    File Fortran
AI Thread Summary
The discussion revolves around reading a data file in Fortran, where the user needs to count the number of lines to allocate memory for integer and real values. The initial approach faced issues with determining the type for the variable reading the data. A solution was proposed to read the data as character data, allowing for flexible input handling. Additionally, the use of an "iostat variable" was suggested to effectively detect the end of the file and manage read errors. The user also sought help with allowing dynamic file name input for the program, which initially failed due to directory issues. It was later discovered that the problem stemmed from the Integrated Development Environment (IDE) being used, which was resolved by switching to a different software. The discussion highlights the importance of file path accuracy and the adaptability of code to different environments.
thomsonm
Messages
13
Reaction score
0
I've been given a data file laid out as such:

heading1 heading2 heading3
x1 y1 z1
x2 y2 z2
x3 y3 z3
.etc.

where x=integer, y,z=real

I need to count the number of lines to allocate x, y and z their sizes. My first attempt looked like:

...

OPEN(21, FILE='data.dat', STATUS=OLD)

counter=1
ok=.FALSE.

DO WHILE (.NOT. ok)
READ(21,'\,1X,I1') first
counter=counter+1
IF (first .EQ. ' ') THEN

numberoflines=counter-1
ok=.TRUE.

ELSE CONTINUE

END IF

END DO

...

This runs into the problem that i don't know what type to make "first" as it'll be looking at integers until the last line.

If anyone can help it'd be much appreciated!
 
Technology news on Phys.org
Read the data as character data, then it will accept anything.

Also, the simplest way to detect the end of file is to specify an "iostat variable" to receive the status of the read statement. After the read statement, if the iostat variable is 0, the read was OK; if it's -1, you reached the end of file; otherwise there was some kind of input error.

Something like this (untested because I don't have a Fortran compiler handy):

Code:
      integer status, counter
      character*1 dummy

      status = 0
      counter = 0
      do while (status .eq. 0)
          read (21, '(1x, a1)', iostat=status) dummy
          if (status .eq. 0)
              counter = counter + 1
          end if
      end do

      if (status .eq. -1) then
          print *, 'The file has ', counter, ' lines.'
      else
          print *, 'There was an input error!  Status code = ', status
      end if
 
That code worked like a charm, thanks!
 


As the title suggests, there's more I'd like to ask:

I want to allow users to input a file name for the program to open:

...
CHARACTER*40 filename

...
OPEN(21,FILE=filename,STATUS='OLD')
...

Somehow this doesn't work, it just says the file doesn't exist. Any thoughts?
 
The program may be looking for the file in a different directory (folder) than you're expecting. Have you tried using a full pathname?

Also, this may depend on the operating system, so it might be useful to tell us which OS you're using.
 
After talking with some friends at uni we realized that it's just the IDE I was using that was the problem. (Silverfrost plato)

After using the universities software it works fine.

Thanks for the speedy response once again!
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I had a Microsoft Technical interview this past Friday, the question I was asked was this : How do you find the middle value for a dataset that is too big to fit in RAM? I was not able to figure this out during the interview, but I have been look in this all weekend and I read something online that said it can be done at O(N) using something called the counting sort histogram algorithm ( I did not learn that in my advanced data structures and algorithms class). I have watched some youtube...

Similar threads

Replies
5
Views
5K
Replies
2
Views
2K
Replies
4
Views
8K
Replies
2
Views
9K
Replies
14
Views
2K
Replies
12
Views
15K
Replies
22
Views
5K
Replies
4
Views
11K
Replies
5
Views
2K
Back
Top