idl文件中的奇怪符号

时间:2013-07-22 00:16:26

标签: file-io idl-programming-language

我写了几个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

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

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

1 个答案:

答案 0 :(得分: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之类的东西计算的,那么它将是一个复杂的浮点数或复数双精度数,具体取决于所使用的输入和关键字。

第二个潜在问题可能是由于格式声明不正确。您没有告诉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