Chinaunix首页 | 论坛 | 博客
  • 博客访问: 155384
  • 博文数量: 116
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2017-08-21 15:04
文章分类

全部博文(116)

文章存档

2014年(1)

2013年(13)

2012年(27)

2011年(49)

2010年(26)

分类: 嵌入式

2011-01-26 15:44:42

weather.c文件:
###########################
#include



#include
#include
#include
#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,"\0",html_flag);
        d=dst;
        //判断是否存在标签
        s=(char*)source;
        e=s;
        while((s=strstr(e,html_flag)))
        {
            if(*(s-1)=='<') break;
            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!='>' && s    if(!(s    {
            *err=ERR_NOT_FIND;
            return (char*)0;
        }
        //存在标签
        s++;
        if(s_t<(e-s-1))
        {
            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)

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

  • 阅读(968) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~