Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: premet 10 Července 2009, 21:19:52
-
Zdravím,
Pokouším se napsat program a spíš se i učím, ale mám problém s tímhle. Nedokážu pořád pochopit jak to pracuje a jedinej zdroj informací je
http://library.gnome.org/devel/glib/stable/glib-Key-value-file-parser.html (http://library.gnome.org/devel/glib/stable/glib-Key-value-file-parser.html)
http://www.gtkbook.com/tutorial.php?page=keyfile (http://www.gtkbook.com/tutorial.php?page=keyfile)
z čehož mi to pořád není jasný
Mám napsanou funkci pro přidávání záznamů
void add_record(gchar *name, gchar *last_name, gchar *birth, gchar *name_holiday)
{
GKeyFile *keyfile;
GKeyFileFlags flags;
GError *error = NULL;
gchar *group_name;
keyfile = g_key_file_new();
flags = G_KEY_FILE_KEEP_COMMENTS;
if (!g_key_file_load_from_file (keyfile, "date_reminder.conf", flags, &error))
{
g_error (error->message);
return;
}
sprintf(group_name,"%s-%s", name, last_name);
g_strup(group_name);
/* Tohle je jenom kontrole záznamů co se tam bude vkládat */
printf("%s %s %s %s %s\n", group_name,name,last_name,birth,name_holiday);
g_key_file_set_string(keyfile, group_name, "name", name);
g_key_file_set_string(keyfile, group_name, "last_name", last_name);
g_key_file_set_string(keyfile, group_name, "birth", birth);
g_key_file_set_string(keyfile, group_name, "name_holiday", name_holiday);
}
Problém je v tom, že se mi to do souboru neuloží a vůbec nevím co mi tam chybí nebo co mám blbě, takže budu rád za každou radu, protože v tuto chvíli víc asi nevymyslím.
Výsledek by měl vypadat asi takhle pro uložení např. Jan, Osel, 4.5.1978, 5.6
[JAN-OSEL]
name=Jan
last_name=Osel
birth=4.5.1978
name_holiday=5.6
Díky :)
-
Prolezl jsem ten první odkaz a zdá se to být správně... zkoušel jsi ještě nakonec uvolnit pomocí g_key_file_free ?
-
Jo to jsem zkoušel, teď tam mám tohle, ale pořád nic
void add_record(gchar *name, gchar *last_name, gchar *birth, gchar *name_holiday)
{
GKeyFile *keyfile;
GKeyFileFlags flags;
GError *error = NULL;
gchar group_name[40];
keyfile = g_key_file_new();
flags = G_KEY_FILE_KEEP_COMMENTS;
if (!g_key_file_load_from_file (keyfile, "date_reminder.conf", flags, &error))
{
g_error (error->message);
return;
}
sprintf(group_name,"%s-%s", name, last_name);
g_strup(group_name);
printf("%s %s %s %s %s\n", group_name,name,last_name,birth,name_holiday);
if(!g_key_file_has_group(keyfile,group_name)) {
g_key_file_set_string(keyfile, group_name, "name", name);
g_key_file_set_string(keyfile, group_name, "last_name", last_name);
g_key_file_set_string(keyfile, group_name, "birth", birth);
g_key_file_set_string(keyfile, group_name, "name_holiday", name_holiday);
} else {
printf("už existuje\n");
}
g_key_file_free(keyfile);
}
-
Todle g_key_file_set_string(keyfile, group_name, "birth", birth); má taky nějakou návratovou hodnotu... co to vrací?
-
Todle g_key_file_set_string(keyfile, group_name, "birth", birth); má taky nějakou návratovou hodnotu... co to vrací?
Právě funkce g_key_file_set_string nemá žádnou návratovou hodnotu
http://library.gnome.org/devel/glib/stable/glib-Key-value-file-parser.html#g-key-file-set-string (http://library.gnome.org/devel/glib/stable/glib-Key-value-file-parser.html#g-key-file-set-string)
-
Sorry moje chyba. Koukal jsem se omylem na funkci s "get".
Takže co to vlastně celý udělá? Vytvoří to soubor date_reminder.conf a v něm nic není?
PS: zkus tam změnit adresu /home/user/date_reminder.conf
-
Sorry moje chyba. Koukal jsem se omylem na funkci s "get".
Takže co to vlastně celý udělá? Vytvoří to soubor date_reminder.conf a v něm nic není?
Ne právě ani nevytvoří, pokud ten soubor neexistuje tak to vyhodí akorát chybu nic víc, takže soubor nejspíš musí existovat. Ale jinak po provedení funkce je soubor pořád prázdný, nějak se mi to celý nezdá ;D
PS: zkus tam změnit adresu /home/user/date_reminder.conf
To na to nebude mít vliv, protože ten soubor to jako otevře, když ho třeba přejmenuju tak už to hodí chybu, takže se souborem to pracuje, akorát do něj nic neuloží.
-
Když jsem teď do toho souboru přidal jeden záznam (ručně editací souboru) a zkusil přidat ten stejnej (přes program) tak mi to vyhodilo, že záznam už existuje, takže se souborem to určitě pracuje, jen vyřešit to ukládání ???
-
Teď jsem našel nějakej sample kde g_key_file_load_from_file používají jen na načtení hodnot.
https://stage.maemo.org/svn/maemo/projects/haf/tags/hildon-desktop/0.0.0-32/src/hd-home-background.c
-
Teď jsem našel nějakej sample kde g_key_file_load_from_file používají jen na načtení hodnot.
https://stage.maemo.org/svn/maemo/projects/haf/tags/hildon-desktop/0.0.0-32/src/hd-home-background.c
Tak nejvíc díky, už jsem pochopil jak to funguje a už mi to jde :).
void add_record(gchar *name, gchar *last_name, gchar *birth, gchar *name_holiday)
{
GKeyFile *keyfile;
GKeyFileFlags flags;
GError *error = NULL;
gchar *group_name;
gchar *buffer;
gsize length;
keyfile = g_key_file_new();
flags = G_KEY_FILE_KEEP_COMMENTS;
if (!g_key_file_load_from_file (keyfile, "date_reminder.dat", flags, &error))
{
g_error (error->message);
return;
}
group_name = g_strdup_printf("%s-%s", name, last_name);
group_name = g_utf8_strup(group_name, 40 * sizeof(gchar));
if(!g_key_file_has_group(keyfile,group_name)) {
g_key_file_set_string(keyfile, group_name, "name", name);
g_key_file_set_string(keyfile, group_name, "last_name", last_name);
g_key_file_set_string(keyfile, group_name, "birth", birth);
g_key_file_set_string(keyfile, group_name, "name_holiday", name_holiday);
} else {
printf("už existuje\n");
}
buffer = g_key_file_to_data(keyfile, &length, NULL);
g_file_set_contents ("date_reminder.dat", buffer, length, &error);
g_key_file_free(keyfile);
g_free(buffer);
g_free (group_name);
}
EDIT: Ješte pár kosmetických úprav, co mi poradil někdo na abclinuxu :)
-
Nemáš zač... jak to začíná na C, tak to by bylo abych se nezapojil :-D
PS: nejsem si jist, ale todle
if (!g_key_file_load_from_file (keyfile, "date_reminder.conf", flags, &error))
{
g_error (error->message);
return;
}
tam možná ani být nemusí, pokud jde jen o ukládání hodnot.
-
Nemáš zač... jak to začíná na C, tak to by bylo abych se nezapojil :-D
PS: nejsem si jist, ale todle
if (!g_key_file_load_from_file (keyfile, "date_reminder.conf", flags, &error))
{
g_error (error->message);
return;
}
tam možná ani být nemusí, pokud jde jen o ukládání hodnot.
Musí, protože musím načíst i ty předchozí záznamy, jinak tam bude uložen vždycky jenom jeden :)
-
Jo jasný chápu... nebyl jsem si právě jistý a nezkoušel jsem to ... díky ;-)