气象仪器装备 2004年第3期
1 整体思路
本台通过网络每隔 10分钟获取一个广州气象
报的报文文件 ,这个文件由各种不同的气象信息组
成,需要编制程序从中自动分检出预报员所需要的
气象信息,所以我们编写了一个软件来实现报文的
自动分检。在编程的实践中得到一些有用的经验,
现介绍如下。
使用的编译器是 VC++6.0,操作系统是
Windows Me。
2 程序的基本框架
①得到当前时间;
②根据当前时间得到需要处理的报文文件名;
③读人当前报文;
④判断出当前报文是否有预报员需要的内容;
⑤把需要的内容分检出来并写入特定的文件。
3 经 验
①广州报的文件名是由“hs+发报时的世界时
. CGD”组成的,比如文件hs021030.CGD就是世界
时间某年某月 2 13 10点 30分的报文。所以可以用
time(time t★)很方便地得到当前的时间,然后再用
localtime(const time_t★)函数得到具体时间标志。
但需要注意的是,得到的时间的表达方式和我们平
时表达时间的习惯方式有很大不同,如:星期一到
星期六的标志分别是 1到 6,这符合我们的习惯,
但星期13的标志却是0,不是7。并且表示年的数字
是 3位数,后 2位表示年,首位固定值是 1。下面是
得到时间的完整源代码:
struct tm★bt;
time t at;
int YY,mm,ww,dd,hh,mn,sc;
time(&at);
bt=localtime(&at);
YY=bt一> tm
— year;
YY=YY一100;
mm‘=bt一> tm
—
mon+1;
dd=bt一> tm
—
mday;
hh=bt一> tm
—
hour;
mn=bt一> tm
_
min;
ww=bt一> tm
—
wday;
SC=bt一> tm
— sec;
②分检报文程序需要处理大量的字符数组,这
时特别要避免出现数组越位,即使在我们的程序中
出现多个数组越位的情况,C语言的编译器也会完
全正常编译并通过,但在程序实际运行过程中就会
暴露出这样或那样的问题,可能会出现莫名其妙和
难以查找的小故障,或者是出现错误中断退出的大
故障。所以在用 sprintf(char*,const char9~,⋯)、
strcat(char★,const char★)、strcpy(char★,const
char★)这样的函数给一个字符数组赋值时一定要
注意检查。另外要注意的是,英文字母是一个字节,
而汉字是两个字节。
③分检报文这类程序需要非常频繁地打开和
关闭报文文件,这时一般用fopen(const char9~,const
char')~)函数就可以了,但这里要注意的就是函数的
第一个参数不能为空值,如果是一个空值的话就会
出错,一般是导致程序立即中断退出。所以需要用
strcmp(const char9~,const char9~)先检查一下:
if()strcmp(c3, ”)=0)return;
else
((fpo=fopen(c3,”r,’))=0)
end if
④要注意运算符的优先级,比如下面的语句是
错误的:
if(fpl=fopen(c4,”r”)=0)
这是因为关系运算符 “=”的 (下转第61页)
一 —
维普资讯 http://www.cqvip.com
气象仪器装备 2004年第 3期
C=a一0.3