On Aug 1, 6:25 am, greg.a...@googlemail.com wrote:
> On Aug 1, 11:33 am, "incognito.me" <incognito...@gmx.de> wrote:
>
>
>
>> I'm trying to read and plot (surface) a very big text (.txt) file
>> (1020, 1024) with a 5 line string Header in IDL. My file looks like a
>> circle made of numbers!!!. That means in some lines and colums there
>> are no numbers only blanks!!!for example my file contains integers
>> between rows 633 and 390 and between columns 650 and 406.At the left
>> side of the file, there are the numbers of rows (1023,1022,1021,....0)
>> my code should not read, but it does. And I also notice, that my code
>> don't begin to read where the data starts!!By running the code I have
>> the following error message: READF: End of file encountered. Unit: 1.
>> Can someone help me?
>> This is how my code looks like
>> pro readfile, filename
>
>> ; file=strupcase(filename)
>> rows=file_lines(file)
>> ;open the file and read the five line header.
>> openr,1,file
>> header=strarr(5)
>> readf,1,header
>> ; Find the number of columns in the file
>> cols=fix(strmid(header(3),14,4))
>> ; Number of rows of the data
>> rows_data=rows-n_elements(header)
>
>> ;Create a big array to hold the data
>> data=intarr (cols, rows_data)
>> ; All blanks should be replaced by zero
>> data[where(data eq ' ')]=0
>> ; A small array to read a line
>> s=intarr(cols)
>> n=0
>> while (~ eof(1) and (n lt rows_data -1 )) do begin
>> ; Read a line of data
>> readf,1,s
>> ; Store it in data
>> data[*,n]=s
>> n=n+1
>> end
>> data=data[*,0:n-1]
>
>> CLOSE,1
>> Shade_surf, data
>> end
>
>> thanks
>
>> incognito
>
> I'm suspicious of the line converting blanks to zeros before you've
> even read them. I don't think the blanks will come out the way you're
> expecting, anyway. I'd suggest you write a program to correctly read
> your first line of data before you go for the whole thing.
>
> Greg
For starters, I'm not sure why you are converting blanks to zeroes
there at all. As far as I can tell, you haven't even initialized any
data yet. It seems like you are trying to convert blanks to zeros on
an integer array which is already filled with zeroes anyway. When I
tried to do that, I got this error:
% Type conversion error: Unable to convert given STRING to Integer.
Which isn't a fatal error, so your code would still run but the line
'data[where(data eq ' ')]=0' wouldn't actually do anything. As for
the rest of your problem, I think what you need is a format
statement. I believe what is happening is that because you haven't
included an explicit format statement (telling it how many columns are
on each line) it simply reads in entries until it fills up a row in
your data array. For instance, look at this file:
12 34 698 934
16 18
17 20 13
14 23 234 123
being read by this pseudo-code:
readf,lun,file,/get_lun
data = intarr(4)
readf,lun,data
print,data
; 12 34 698 934
readf,lun,data
print,data
; 16 13 17 20
readf,lun,data
print,data
; 14 23 234 123
readf,lun,data
% READF: End of file encountered. Unit: 100, File: test
See, because you have no format specified, each readf keeps reading
data in until the data array is filled. You are assuming that readf
reads one line at a time, but that's not happening, which is why your
data isn't where it's supposed to be. Also, because it is reading
faster than one line at a time, you are reading to the end of the file
before you call readf (rows_data) times, and then you get the EOF
error. The solution is to give it a format:
IDL> openr,lun,'test',/get_lun
IDL> format = '(i3, 1x, i3, 1x, i3, 1x, i3)'
IDL> readf,lun,test,format=format
IDL> print,test
12 34 698 934
IDL> readf,lun,test,format=format
IDL> print,test
16 0 0 18
IDL> readf,lun,test,format=format
IDL> print,test
17 20 0 13
IDL> readf,lun,test,format=format
IDL> print,test
14 23 234 123
|