linux终端天气,Linux C写的终端天气预报查询

#include "get_detail_from_html.h"

#define LINE_LEN    1024

#define DAY_TAG_STRING        "今天白天"

#define NIGHT_TAG_STRING    "今天夜间"

#define PHP_NAME            "/tmp/weather.php"

#define HTML_NAME            "/tmp/weather.html"

typedef struct _info

{

unsigned char DON;//白天还是夜间,0:day,1:night

char t[16];//实际温度

char f[16];//体感温度

char type[16];//天气类型

char wing[32];//风向

}info_t;

typedef struct _weather

{

info_t day;

info_t night;

unsigned char gd;

unsigned char gnt;

}weather_t,*weather_p;

//int readfile(const char* filename);

int get_weather_info(const char* filename,weather_p info);

int main(int argc, char **argv)

{

if(argc != 2)

{

printf("Usage: %s \n",argv[0]);

}

char* cityname=argv[1];

char cmd[128];

pid_t pid;

weather_t weather;

memset(&weather,0,sizeof(weather_t));

weather.day.DON=0;

weather.night.DON=1;

printf("Connecting ...\n");

//get the weather file from sina weather web by

//wget -O weather.php

//and turn gbk to utf8 by iconv -f gbk -t utf8 xxx.php > xxx.html

sprintf(cmd,"wget -q -O %s %s",PHP_NAME,cityname);

system(cmd);

sprintf(cmd,"iconv -f gbk -t utf8 %s > %s",PHP_NAME,HTML_NAME);

system(cmd);

//switch(readfile(filename))

switch(get_weather_info(HTML_NAME,&weather))

{

case 0:

printf("%s's weather is:\n",cityname);

if(weather.gd)

{

printf("day:\t%s\t%s\t%s\n",weather.day.t,weather.day.type,weather.day.wing);

}

if(weather.gnt)

{

printf("night:\t%s\t%s\t%s\n",weather.night.t,weather.night.type,weather.night.wing);

}

break;

default:

printf("error.please try again and make sure the city name be true.\n");

break;

}

return 0;

}

int get_weather_info(const char* filename,weather_p weather)

{

FILE *fp;

char rline[LINE_LEN];

int flag=0;

char* rs;

if((fp = fopen(filename,"r"))==NULL)

{

perror("fopen");

return -1;

}

while(1)

{

rs=fgets(rline,LINE_LEN,fp);

if(flag==2 || rs==NULL || !strlen(rline)) break;

if(strstr(rline,DAY_TAG_STRING))

{

flag=1;

//printf("%s\n",rline);

//get day weather information.

err_info err;

weather->gd=1;

while(!strstr(fgets(rline,LINE_LEN,fp),"

"));

get_detail_from_html(rline,weather->day.t,sizeof(weather->day.t),"span",&err);

if(err!=ERR_NO)

{

weather->gd=0;

printf("day t error: %s\n",get_err_info(err));

}

fgets(rline,LINE_LEN,fp);

get_detail_from_html(rline,weather->day.type,sizeof(weather->day.type),"li",&err);

if(err!=ERR_NO)

{

weather->gd=0;

printf("day type error: %s\n",get_err_info(err));

}

fgets(rline,LINE_LEN,fp);

get_detail_from_html(rline,weather->day.wing,sizeof(weather->day.wing),"li",&err);

if(err!=ERR_NO)

{

weather->gd=0;

printf("day wing error: %s\n",get_err_info(err));

}

}

if(strstr(rline,NIGHT_TAG_STRING))

{

flag=2;

//printf("%s\n",rline);

//get day weather information.

weather->gnt=1;

err_info err;

while(!strstr(fgets(rline,LINE_LEN,fp),"

"));

get_detail_from_html(rline,weather->night.t,sizeof(weather->night.t),"span",&err);

if(err!=ERR_NO)

{

weather->gd=0;

printf("night t error: %s\n",get_err_info(err));

}

fgets(rline,LINE_LEN,fp);

get_detail_from_html(rline,weather->night.type,sizeof(weather->night.type),"li",&err);

if(err!=ERR_NO)

{

weather->gd=0;

printf("night type error: %s\n",get_err_info(err));

}

fgets(rline,LINE_LEN,fp);

get_detail_from_html(rline,weather->night.wing,sizeof(weather->night.wing),"li",&err);

if(err!=ERR_NO)

{

weather->gd=0;

printf("night wing error: %s\n",get_err_info(err));

}

}

}

fclose(fp);

return 0;

}

################################

get_detail_from_html.h

#ifndef GET_DETAIL_FROM_HTML_H

#define GET_DETAIL_FROM_HTML_H

typedef enum _err_info

{

ERR_NO=0,

ERR_NOT_FIND,

ERR_DST_SHORT

}err_info;

char* get_detail_from_html(const char* source,char* dst,size_t s_t,const char* html_flag,err_info* err);

char* get_err_info(err_info err);

#endif //GET_DETAIL_FROM_HTML_H

###############################

get_detail_from_html.c

#include #include #include "get_detail_from_html.h"

char* get_detail_from_html(const char* source,char* dst,size_t s_t,const char* html_flag,err_info* err)//html_flag e.g: body

{

char *s=NULL,*e=NULL,*d=NULL;

char html_end[32];

sprintf(html_end,"%s>\0",html_flag);

d=dst;

//判断是否存在标签

s=(char*)source;

e=s;

while((s=strstr(e,html_flag)))

{

if(*(s-1)=='        e=s+1;

}

if(!s)

{

*err=ERR_NOT_FIND;

return s;

}

if(!(e=strstr(s,html_end)))

{

*err=ERR_NOT_FIND;

return e;

}

while(*s!='>' && sif(!(s{

*err=ERR_NOT_FIND;

return (char*)0;

}

//存在标签

s++;

if(s_t    {

printf("%d:%d\n",s_t,(e-s-1));

*err=ERR_DST_SHORT;

return (char*)0;

}

memcpy(dst,s,e-s);

dst[e-s]='\0';

*err=ERR_NO;

return d;

}

char* get_err_info(err_info err)

{

switch(err)

{

case ERR_DST_SHORT:

return "dst lenght is too short.";

break;

case ERR_NOT_FIND:

return "cannot find tag.";

break;

case ERR_NO:

return "";

break;

default:

return "Unknow error.";

break;

}

}

#############################

Makefile

CC=gcc

OBJ=weather.o get_detail_from_html.o

all:weather

weather:$(OBJ)

$(CC) $^ -o $@

weather.o:weather.c get_detail_from_html.h

$(CC) -c $< -o $@

get_detail_from_html.o: get_detail_from_html.c get_detail_from_html.h

$(CC) -c $< -o $@

clean:

-rm weather $(OBJ)

############################

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值