1

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

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

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

4

1 回答 1

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
于 2014-09-26T15:05:08.900 回答