📄 sxhread.pro
字号:
pro sxhread, name, header;+; NAME:; SXHREAD; PURPOSE:; Procedure to read a STSDAS header from disk.; EXPLANATION:; This version of SXHREAD can read two types of disk files; (1) Unix stream files with a CR after every 80 bytes; (2) Variable length record files ; (3) Fixed length (80 byte) record files;; CALLING SEQUENCE:; sxhread, name, header;; INPUT:; name - file name, scalar string. An extension of .hhh is appended; if not already supplied. (Note STSDAS headers are required; to have a 3 letter extension ending in 'h'.) gzip extensions; .gz will be recognized as compressed.; OUTPUT:; header - STSDAS header, string array; NOTES:; SXHREAD does not do any checking to see if the file is a valid; STSDAS header. It simply reads the file into a string array with; 80 byte elements;; HISTORY:; Version 1 D. Lindler July, 1987; Version 2 M. Greason, August 1990; Use READU for certain ST VAX GEIS files W. Landsman January, 1992; Read variable length Unix files E. Deutsch/W. Landsman November, 1994; Converted to IDL V5.0 W. Landsman September 1997; Updated by E. Artigau to handle gzipped fits August 2004; Remove VMS support, W. Lnadsman September 2006;-;-------------------------------------------------------------------- compile_opt idl2 On_error,2 ;Return to caller if N_params() LT 2 then begin print,'Syntax - SXHREAD, name, header' return endif; Add extension name if needed hname = strtrim(name,2) if strpos(hname,'.',strpos(hname,']') ) EQ -1 then hname = hname + '.hhh' compress = (strmid(name,strlen(name)-2,2) eq 'gz') openr, unit, hname, /GET_LUN, ERROR = err,COMPRESS = compress if err LT 0 then goto, BADFILE len = 80 & ai = 99 ;Usual header length is 80 bytes ;but Unix files may have an ;embedded carriage returns to make atmp = assoc(unit,bytarr(85)) ;header length 81 bytes a=atmp[0] & ai=0 while (a[ai] ne 10) and (a[ai] ne 13) and (ai lt 84) do ai=ai+1 if (ai EQ 80) then len=81 Point_lun, unit, 0 ;Back to the beginning of the file; Get the number of lines in the header status = fstat(unit) nlines = status.size/len ;Number of lines in file if (ai lt 80) then goto,VAR_LENGTH; Read header header = bytarr(len,nlines ,/NOZERO) On_ioerror, VAR_LENGTH ;READU cannot be used on variable length records readu, unit, header header = string(header) On_ioerror,NULL free_lun,unit ;Close and free file unit; Trim to the END line, and delete carriage returns if necessary endline = where( strmid(header,0,8) EQ 'END ',nfound) if nfound gt 0 then header = header[0:endline[0]] else $ message,'WARNING: No END statement found in header',/inform if len EQ 81 then header = strmid(header,0,80) returnVAR_LENGTH: ;Now try to read as variable length records Point_lun, unit, 0 ;Back to the beginning of file h = '' & header = strarr( nlines) i = 0 On_ioerror,NOEND ;Can't use EOF function on certain GEIS files while ( strtrim( strmid(h,0,8), 2) NE 'END') do begin readf, unit, h if (strlen(h) LT 80) then h=h+string(replicate(32b,80-strlen(h))) header[i] = h ;Swapped with line above 95-Aug i = i + 1 if i EQ nlines then begin header = [header,strarr(100)] nlines = nlines + 100 endif endwhile header = header[0:i-1] free_lun,unit returnNOEND: message,'WARNING - No END statement found in header', /INFORM free_lun,unit returnBADFILE: message,'Error opening file ' + ' ' + hname returnend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -