按c表示的星期几的组列表

时间:2012-02-07 22:49:47

标签: c

我希望按星期几从xmltv列表中分组电视节目信息。我写了这段代码:

int epg_show_perchannel( tv_osd_t* osd, int page, station_mgr_t *stationmgr, xmltv_t *xmltv, int channel )
{
if (!page)
    return 0;
if ( xmltv ){
    const int buf_length = 255;
    const int max_num_lines = 15;
    const int num_stations = station_get_num_stations( stationmgr );
    char *old_channel = strdup( xmltv_get_channel( xmltv ) );
    char buf[buf_length+1];
    int cur = 0;
    time_t curtime = time( 0 );
    const char *xmltv_id = 0;

    if (channel > num_stations)  
        channel = 1;
    else if (channel < 1 )
        channel = num_stations;

    if (!(xmltv_id = station_get_xmltv_id( stationmgr, channel-1 ))) 
        xmltv_id = xmltv_lookup_channel( xmltv, station_get_name( stationmgr, channel-1 ));
    xmltv_set_channel( xmltv, xmltv_id);
    xmltv_refresh_withtime( xmltv, curtime );

    /* List header with Channel number + name */
    snprintf(buf, buf_length, "%d Next on [%s] %s:", channel, station_get_channel(stationmgr,channel-1), station_get_name( stationmgr, channel-1));
    tv_osd_list_set_text( osd, cur++, buf );
    tv_osd_list_set_hilight(osd, -1);   

    while ((cur-1) < max_num_lines) {
        xmltv_refresh_withtime( xmltv, curtime );
        /* day of current program*/
        char start_time[50];
        time_t start_timestamp = xmltv_get_start_time( xmltv );
        strftime( start_time, 50, "%A:", localtime( &start_timestamp ) );
        snprintf(buf, buf_length, "%s", start_time, xmltv_get_start_time( xmltv ));
        tv_osd_list_set_text( osd, cur++, buf, 1);

        if (xmltv_get_title( xmltv )) {
            char start_time[50];
            time_t start_timestamp = xmltv_get_start_time( xmltv );
            time_t end_timestamp = xmltv_get_end_time( xmltv );
            strftime( start_time, 50, "%H:%M", localtime( &start_timestamp ) );

            /* starttime of current program + Now showing program */
            snprintf(buf, buf_length, "%s %s", start_time, xmltv_get_title( xmltv ));       
            if (xmltv_get_sub_title( xmltv )){
                strncat(buf," (",buf_length-strlen(buf));  
                strncat(buf,xmltv_get_sub_title( xmltv ),buf_length-strlen(buf));
                strncat(buf,")",buf_length-strlen(buf));  
            }
            tv_osd_list_set_text( osd, cur++, buf, 1);

            if (!xmltv_get_next_title( xmltv )) {
                char end_time[50];
                /* no next program, print endtime of current programme */       
                strftime( end_time, 50, "%H:%M", localtime( &end_timestamp ) );
                snprintf(buf, buf_length, "%s %s", end_time, "");       
                tv_osd_list_set_text( osd, cur++, buf, 1);
            }
        curtime = end_timestamp;**

        } else {
            /* No XMLTV information for this channel */
            tv_osd_list_set_text( osd, cur++, "");
        }

    }
    tv_osd_list_set_lines( osd, cur );
    tv_osd_show_list( osd, 1, 1 );

    xmltv_set_channel(xmltv, old_channel);
    free(old_channel);
    xmltv_refresh( xmltv );

} else {
    tv_osd_list_set_text( osd, 0, "No XMLTV Program Guide information available" );
    tv_osd_list_set_lines( osd, 1 );
    tv_osd_show_list( osd, 1, 1 );
}
return channel;
}

这将提取数据(并从xmltv文件发送到应用程序并使用15行创建列表), 但我不知道如何按星期几组合:

当前输出(代码段以:“while((cur-1)&lt; max_num_lines){ “):

Sunday:
00:20     Luke, mână rece
Sunday:
02:50     Moartea va fi atât de dulce
Sunday:     
04:45     Interviurile : Matthew Modine Despre Kubrick şi Platoşa de metal
Sunday:     
05:00     Ocean's eleven - Faceţi jocurile!
Sunday:     
22:00     Moartea va fi atât de dulce     
Monday:
00:15     Fără suflare
Monday:     
02:30     Celebritate

我想要的(不是每行插入一天的名字,只有当一天结束时):

Sunday:
00:20     Luke, mână rece     
02:50     Moartea va fi atât de dulce     
04:45     Interviurile : Matthew Modine Despre Kubrick şi Platoşa de metal     
05:00     Ocean's eleven - Faceţi jocurile!     
22:00     Moartea va fi atât de dulce     
Monday:
00:15     Fără suflare     
02:30     Celebritate     
04:40     Sub influenţa lui: Joan Allen     
05:15     Fără suflare     
22:00     Necruţătorul     
Tuesday:
00:30     Point Blank     
02:25     Mumia     

提取数据的部分xmltv列表:

<programme start="20120205220000 +0100" stop="20120205225500 +0100" channel="006.port.hu">

感谢。

2 个答案:

答案 0 :(得分:0)

在伪代码中,假设项目按日期时间排序,您可以这样做:

last_printed_day = null

foreach item in items
    if item.day != last_printed_day
        print item.day
        last_printed_day = item.day
    end
    print item
end

您可能希望跟踪最后打印的实际日期,即使您打印的日期仅格式化为工作日名称。这样,如果你有一个只有周日数据的数据集,你仍然会在每天开始时打印“星期日”。

答案 1 :(得分:0)

我还没有真正研究过你的代码 你想要做的是检查当天是否与前一天相同,如果不打印它。

将前一天初始化为无效值

char previousday[500] = "invalid"; /* you might want to use less than 500 chars */

并在循环中继续检查

if (strcmp(start_time, previousday) != 0) {
    // print, or add to buffer, start_time
    strcpy(previousday, start_time);
}