Magnus Myrefors escribió:
> Hi,
>   Ok, here's a small part of it. The whole file is about
> 2400 rows. I can read over approximately 95 % of it ok
> but the rest is somewhat corrupted. I think it is
> the function g_ascii_isdigit() that fails sometimes which 
> leaves a uncompleted conversion. I am about to try another
> way without this function.
>
> /Magnus
>  
> On Wed, 05 Sep 2007 16:29:02 -0300
> Matí­as Alejandro Torres <[EMAIL PROTECTED]> wrote:
>
>   
>> What's the input file like? Can you attach a part of it? If you do
>> so, I can make a try on reading it.
>>
>> Matías
>>     
>> ------------------------------------------------------------------------
>>
>>  Longtitude  Latitude   Altitude  IntervalTime  HeartRate  Speed
>>
>> --------------------------------------------------------------
>>
>> 1134:17.64662 59.84263 15  10  0  11.45
>>
>> 1135:17.64661 59.84266 15  10  0  12.59
>>
>> 1136:17.64661 59.84269 14  10  0  10.89
>>
>> 1137:17.64660 59.84272 14  10  0  10.83
>>
>> 1138:17.64659 59.84275 13  10  0  12.58
>>
>> 1139:17.64659 59.84278 13  10  0  11.19
>>
>> 1140:17.64658 59.84281 13  10  0  11.76
>>
>> 1141:17.64656 59.84284 13  10  0  12.08
>>
>> 1142:17.64655 59.84286 12  10  0  11.95
Here's the minimal program to read that. The reading part is kind of 
crappy but it works with that example.
The reading part reads char by char. Using the g_ascii_is_digit only to 
skip the header.



Matias

/* BEGIN */

#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include <glib.h>
#include <glib/gstdio.h>

typedef enum {
    MODEL_LOG,
    MODEL_LATITUDE,
    MODEL_ALTITUDE,
    MODEL_INTERVAL,
    MODEL_HEARTBEAT,
    MODEL_SPEED,
    MODEL_NUM_COLUMNS
} ModelColumns;

typedef struct _Data {
    gchar         *log;
    gdouble     latitude;
    gint         altitude;
    gint         interval;
    gint         heartbeat;
    gdouble     speed;
} Data;


GtkTreeModel *
do_model (GSList *list)
{
    GSList *act;
    GtkListStore *store;

    store = gtk_list_store_new (MODEL_NUM_COLUMNS, G_TYPE_STRING, 
G_TYPE_DOUBLE, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_DOUBLE);
   
    act = list;
    while (act != NULL) {
        GtkTreeIter iter;
        Data * data = act->data;
       
        gtk_list_store_append (store, &iter);
        gtk_list_store_set (store, &iter,
                            MODEL_LOG, data->log,
                            MODEL_LATITUDE, data->latitude,
                            MODEL_ALTITUDE, data->altitude,
                            MODEL_INTERVAL, data->interval,
                            MODEL_HEARTBEAT, data->heartbeat,
                            MODEL_SPEED, data->speed, -1);
               
        act = g_slist_next (act);
    }
   
    return GTK_TREE_MODEL (store);
}

GtkWidget *do_window (GtkTreeModel *model) {
    GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    GtkWidget *tree_view = gtk_tree_view_new ();
    GtkWidget *scroll;
    GtkCellRenderer *rend;
    GtkTreeViewColumn *col;

    tree_view = gtk_tree_view_new ();
    gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
    gtk_tree_view_columns_autosize (GTK_TREE_VIEW (tree_view));

    rend = gtk_cell_renderer_text_new ();
    col = gtk_tree_view_column_new_with_attributes ("Longitude", rend, 
"text", MODEL_LOG, NULL);
    gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col);

    rend = gtk_cell_renderer_text_new ();
    col = gtk_tree_view_column_new_with_attributes ("Latitude", rend, 
"text", MODEL_LATITUDE, NULL);
    gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col);

    rend = gtk_cell_renderer_text_new ();
    col = gtk_tree_view_column_new_with_attributes ("Altitude", rend, 
"text", MODEL_ALTITUDE, NULL);
    gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col);
   
    rend = gtk_cell_renderer_text_new ();
    col = gtk_tree_view_column_new_with_attributes ("Interval", rend, 
"text", MODEL_INTERVAL, NULL);
    gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col);
   
    rend = gtk_cell_renderer_text_new ();
    col = gtk_tree_view_column_new_with_attributes ("Heartbeat", rend, 
"text", MODEL_HEARTBEAT, NULL);
    gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col);
   
    rend = gtk_cell_renderer_text_new ();
    col = gtk_tree_view_column_new_with_attributes ("Speed", rend, 
"text", MODEL_SPEED,  NULL);
    gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col);
   
    gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), model);
    gtk_widget_set_size_request (tree_view, -1, 300);
   
    scroll = gtk_scrolled_window_new (NULL, NULL);
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), 
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
   
    gtk_container_add (GTK_CONTAINER (scroll), tree_view);
    gtk_container_add (GTK_CONTAINER (window), scroll);
   
    return window;
}

GSList* reader (FILE *file)
{
    Data *data;
    gchar c;
    gchar tmp [50];
    int campo = 0, cont = 0;
    GSList *list = NULL;
   
    while (c != EOF) {
        campo = 0;
        cont = 0;
           
        c = fgetc (file);
        while ((c != '\n') && (c != EOF) && (g_ascii_isdigit (c))) {
            while ((c != ' ') && (c != '\t') && (c != '\n') && (c != EOF)) {
                tmp [cont++] = c;
                c = fgetc (file);
            }
            tmp [cont++] = '\0';

            if (campo == 0) {
                data = g_new0 (Data, 1);
                list = g_slist_append (list, data);
            }
            switch (campo) {
                case 0:
                    data->log = g_strdup (tmp);
                    break;
                case 1:
                    data->latitude = g_strtod (tmp, NULL);
                    break;
                case 2:
                    data->altitude = atoi (tmp);
                    break;
                case 3:
                    data->interval = atoi (tmp);
                    break;
                case 4:
                    data->heartbeat = atoi (tmp);
                    break;
                case 5:
                    data->speed = g_strtod (tmp, NULL);
                    break;
                default:
                    printf ("Damn!\n");
            }
           
            while (((c == ' ') || (c == '\t')) && (c != EOF))
                c = fgetc (file);
            cont = 0;
            campo++;
        }
    }
   
    return list;
}

gint
main (gint argc, gchar **argv)
{
    gchar *filename = "sequence.txt";
    FILE *file;

    file = g_fopen (filename, "r");
   
    gtk_init (&argc, &argv);
   
    if (file != NULL) {
        GSList *list;
        GtkTreeModel *model;
        GtkWidget *window;
       
        list = reader (file);
       
        model = do_model (list);
        window = do_window (model);
        g_signal_connect (window, "delete-event", (GCallback) 
gtk_main_quit, NULL);
        gtk_widget_show_all (window);
       
        g_slist_foreach (list, (GFunc) free, NULL);
        g_slist_free (list);
       
        gtk_main ();
    }
       
    return 0;
}



_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to