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

Název: Glib key-value file parser [vyřešeno]
Přispěvatel: 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ů
Kód: [Vybrat]
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
Kód: [Vybrat]
[JAN-OSEL]
name=Jan
last_name=Osel
birth=4.5.1978
name_holiday=5.6

Díky  :)
Název: Re: Glib key-value file parser
Přispěvatel: Martin - ViPEr*CZ* 10 Července 2009, 22:01:25
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 ?
Název: Re: Glib key-value file parser
Přispěvatel: premet 10 Července 2009, 22:07:24
Jo to jsem zkoušel, teď tam mám tohle, ale pořád nic
Kód: [Vybrat]
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);
}
Název: Re: Glib key-value file parser
Přispěvatel: Martin - ViPEr*CZ* 10 Července 2009, 22:21:27
Todle g_key_file_set_string(keyfile, group_name, "birth", birth); má taky nějakou návratovou hodnotu... co to vrací?
Název: Re: Glib key-value file parser
Přispěvatel: premet 10 Července 2009, 22:24:01
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)
Název: Re: Glib key-value file parser
Přispěvatel: Martin - ViPEr*CZ* 10 Července 2009, 22:28:12
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
Název: Re: Glib key-value file parser
Přispěvatel: premet 10 Července 2009, 22:30:36
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ží.
Název: Re: Glib key-value file parser
Přispěvatel: premet 10 Července 2009, 22:36:06
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í  ???
Název: Re: Glib key-value file parser
Přispěvatel: Martin - ViPEr*CZ* 10 Července 2009, 22:45:44
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
Název: Re: Glib key-value file parser
Přispěvatel: premet 10 Července 2009, 22:57:23
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  :).
Kód: [Vybrat]
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  :)
Název: Re: Glib key-value file parser [vyřešeno]
Přispěvatel: Martin - ViPEr*CZ* 10 Července 2009, 23:09:13
Nemáš zač... jak to začíná na C, tak to by bylo abych se nezapojil :-D

PS: nejsem si jist, ale todle

Kód: [Vybrat]
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.
Název: Re: Glib key-value file parser [vyřešeno]
Přispěvatel: premet 10 Července 2009, 23:11:05
Nemáš zač... jak to začíná na C, tak to by bylo abych se nezapojil :-D

PS: nejsem si jist, ale todle

Kód: [Vybrat]
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  :)
Název: Re: Glib key-value file parser [vyřešeno]
Přispěvatel: Martin - ViPEr*CZ* 10 Července 2009, 23:15:37
Jo jasný chápu... nebyl jsem si právě jistý a nezkoušel jsem to ... díky ;-)