爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5446|回复: 7

[混合编程] IDL编程学习之格式化控制符应用

[复制链接]

新浪微博达人勋

发表于 2017-12-8 14:32:05 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
格式化控制符
a
字符/字符串的格式化输入输出
如果没有有效的变量,则终止输入输出
$
不输入换行符,这样可实现多次输入为一行(续行符呗!)
F,D,E,G
用于浮点数的输入输出
B,I,O,Z
整数输入输出时进制转换(B二进制,I十进制,O八进制,Z十六进制)
Q
读取获得当前行的字符数
字符串和H
用引用字符或H直接输出字符
T
变量输出的绝对位置
TL
从当前位置向左(后)移动
TR
从当前位置向右(前)移动
C()
用于输出日期数据(Julian data格式),/格式,时间格式
C printf-Style
提供C语言风格的格式化输出
/
换行输出

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-8 14:42:52 | 显示全部楼层
案例1
IDL> print,format='(3I6)',[0,10,120]
     0    10   120

3I6中,3表示格式控制符重复3次,6表示每个元素占6位
上面的输出为:
5个空格+0+4个空格+10+3个空格+120
_____0____10___120
修改3的实验:
IDL> print,format='(I6)',[0,10,120]
     0
    10
   120
IDL> print,format='(1I6)',[0,10,120]
     0
    10
   120
IDL> print,format='(2I6)',[0,10,120]
     0    10
   120
IDL> print,format='(3I6)',[0,10,120]
     0    10   120
IDL> print,format='(4I6)',[0,10,120]
     0    10   120
IDL> print,format='(5I6)',[0,10,120]
     0    10   120

可以发现,重复次数关系着换行;
对输出格式的控制,关系着把数据输出到txt等中的排列方式,十分实用!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-8 14:51:54 | 显示全部楼层
案例2正数前加+号(负数不变)(6表示占6个空格的位置)

print,format='(I+6)',[-10,0,10]
   -10
    +0
   +10

IDL> print,format='(3I+6)',[-10,0,10]
   -10    +0   +10


案例3
正号改成负号不是加负号,而是表示左对齐,因为从案例1案例2发现输出的数字都是右对齐的。
IDL> print,format='(I-6)',[-10,0,10]
-10   
0     
10   
IDL> print,format='(3I-6)',[-10,0,10]
-10   0     10  

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-8 14:59:43 | 显示全部楼层
案例4
给的位数不够,字符串会被截断(从左)
IDL> print,format='(a4)',['abcdef','xyz']
abcd
xyz
IDL> print,format='(2a4)',['abcdef','xyz']
abcd xyz

IDL> print,format='(2a-6)',['abcdef','xyz']
abcdefxyz   

对于数字,位数不够就只会输出N个*,并不截断
IDL> print,format='(3I4)',[-12345,00,98765]
****   0****

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-8 15:05:15 | 显示全部楼层
案例5
数字左侧补0
IDL> print,format='(I07)',[-12345,00,98765]
-012345
0000000
0098765

案例6
数字位数给的不够就输出***,但是位数为0则按原始输出,不影响。
小结
3I08:字符格式用3次,十进制型,数字前补零,占8位
2I+9:字符格式用2次,十进制型,正数补正号,占9位
4I-7:字符格式用4次,十进制型,左对齐,占7位
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-8 15:29:46 | 显示全部楼层
案例6冒号符用于在元素之间插入分隔符,默认的是空格
分隔符为冒号:

IDL> print,format='(6(I,:,":"))',[0,1,2,3,4,5]
      0:      1:      2:      3:      4:      5
分隔符为逗号:
IDL> print,format='(6(I,:,","))',[0,1,2,3,4,5]
      0,      1,      2,      3,      4,      5
分隔符为钱:
IDL> print,format='(6(I,:,"$"))',[0,1,2,3,4,5]
      0$      1$      2$      3$      4$      5
分隔符为井号:
IDL> print,format='(6(I,:,"#"))',[0,1,2,3,4,5]
      0#      1#      2#      3#      4#      5
分隔符为abc:
IDL> print,format='(6(I,:,"abc"))',[0,1,2,3,4,5]
      0abc      1abc      2abc      3abc      4abc      5


密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-8 16:33:05 | 显示全部楼层
案例77.1、
向文件中写入字符
在“当前目录”中打开demo.txt文件,并把文件索引给lun,这样,这个文件就是输出端了

openw,lun,'demo.txt',/get_lun
把字符串输出到lun中:
printf,lun,'abc'&printf,lun,'def'
free_lun,lun


demo.txt文件内容为
abc
def


7.2、
如果文件不存在会自动被创建,
想上面这样没有写路径,默认路径为“当前路径”,
路径也可以自己写,
把字符串输出到桌面的文件中(系统会自动生成文件):
openw,lun,'C:\Users\YGDY\Desktop\demo.txt',/get_lun
printf,lun,'abc'&printf,lun,'def'
free_lun,lun


7.3、
不换行:
openw,lun,'C:\Users\YGDY\Desktop\demo.txt',/get_lun
printf,lun,format='($,a)','abc'&printf,lun,'def'
free_lun,lun

结果:
abcdef


密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-8 17:06:14 | 显示全部楼层
案例8***
关键字Q获得当前行的字符数

IDL> read,charnumber,format='(q)'
: abcdefgh(该行是手动键入的)
IDL> charnumber
       8.0000000

也就是说获得的不是内容,只是数目?

***
openr,lun,'C:\Users\YGDY\Desktop\demo.txt',/get_lun
readf,lun,x,format='(q)'
free_lun,lun
print,x


因为文件内容是abcdef,所以输出6
***
综合玩耍:
1、写入
x='abcdef'
openw,lun,'C:\Users\YGDY\Desktop\demo.txt',/get_lun
printf,lun,x
close,/all
2、读出
openr,lun,'C:\Users\YGDY\Desktop\demo.txt',/get_lun
readf,lun,x,format='(A)'
free_lun,lun
print,x

输出:
abcdef
注意printf是x→lun;readf是lun→x
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表