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