2013-07-22 70 views
1

我写了几个IDL程序来分析一些数据。为了保持简单,程序读入一些时变数据并计算傅立叶频谱。该频谱被写入使用此代码文件中:文件中的idl奇怪符号

openw,3,filename   
printf,3,[transpose(freq),transpose(power)],format='(e,e)' 
close,3 

该文件,然后通过使用此代码另一个程序读取:

rdfloat,filename,freq,power,/double 

的rdfloat程序可以在这里找到:http://idlastro.gsfc.nasa.gov/

的当我试图读取一个文件时出现错误是:“输入转换错误。单位:101” 当我深入到被读取的文件时,我注意到几种无法识别的字符。我不知道如果这些都是写入文件或某些别的东西与所创建的文件的数量的结果(超过300个文件)

这些符号/字符是单号的地方:

< dle> < dc1> < dc2> < dc3> < dc4> < can> < nak> < em> < soh> < syn> 

正在读取的文件中出现的示例,请注意它们不是连续的行。

7.7346< dle>18165493007e+01 8.4796811549010105e+00 
7.7354408697119453e+01 1.04459538071< dc2>1749e+01 
7.7360701595839< can>28e+01 3.0447318983094189e+00 

每当我运行写入文件的过程时,总是至少有一个文件具有部分或全部这些字符。包含这些字符的文件总是不同的。

任何人都可以解释这些符号是什么,我可能会做什么来创建它们以及如何确保它们不写入文件?

回答

0

我看到两件可能导致问题的事情。但首先,我想提出一些建议。

打开文件时,使用/ GET_LUN关键字很有用,因为它允许IDL查找并使用可用的逻辑单元号(LUN)(例如,如果您将LUN 3在其他位置打开) 。打印格式化数据时,应指定总宽度和小数位数。它会让事情变得更容易,因为那样你就不必担心改变文件中数字之间的间距。

所以我的第一套代码更改为以下(或以下的一些变体):

OPENW,gunit,filename[0],/GET_LUN,ERROR=err 
FOR j=0L, N_ELEMENTS(freq) - 1L DO BEGIN 
    PRINTF,gunit,freq[j],power[j],FORMAT='(2e20.12)' 
ENDFOR 
FREE_LUN,gunit ;; this is better than using the CLOSE routine 

所以我看到的第一个潜在的问题是,如果你的变量power使用类似计算FFT.pro,那么它将是一个复杂的浮点数或复数double,具体取决于所使用的输入和关键字。

第二个潜在问题可能是由于格式声明不正确。您没有告诉PRINTF预计有多少列或行。它可能不知道如何正确处理输入,所以它猜测并可能导致你显示的那些字符。这些字符可能是空格字符,因为模糊格式语句或您用来查看文件的软件(例如,我不推荐使用Word打开文本文件,使用文本编辑器)。

侧面说明:您可以打开并阅读你只是以类似的方式写信给我上面显示的文件,但更改为以下:

n = FILE_LINES(filename[0]) 
freq = DBLARR(n) 
power = DBLARR(n) 
OPENR,gunit,filename[0],/GET_LUN,ERROR=err 
FOR j=0L, N_ELEMENTS(freq) - 1L DO BEGIN 
    READF,gunit,freq[j],power[j],FORMAT='(2e20.12)' 
ENDFOR 
FREE_LUN,gunit ;; this is better than using the CLOSE routine