Re: Conversion functions.
- From: Matías Alejandro Torres <torresmat gmail com>
- To: Magnus Myrefors <myrefors magnus telia com>, gtk-app-devel-list gnome org
- Subject: Re: Conversion functions.
- Date: Thu, 06 Sep 2007 11:00:11 -0300
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 <torresmat gmail com> 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;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]