c - 在 c 中按星期几分组列表

标签 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) < 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">

谢谢。

最佳答案

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

将前一天初始化为无效值

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);
}

关于c - 在 c 中按星期几分组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9185239/

相关文章:

c++ - 主线程和插件中的pthread?

c - 我怎样才能 "pause"应用程序让用户按下按钮? GTK

c++ - 为什么数据类型的大小会随着操作系统的变化而变化?

C 编程数据类型

c - 吃 bean 的搜索算法

C语言编程——打印句子

c - 查找C程序中的错误

c - 在 C 中访问二维数组的元素

c - 为矩阵动态分配数组

c - 使用 OpenSSL 将自定义扩展添加到 PKCS#10 请求(以编程方式)