Sauvegarder et charger des objets dans un fichier.

Sauvegarder et charger des objets dans un fichier. - C - Programmation

Marsh Posté le 22-02-2008 à 19:18:40    

Bonjour à tous :)
 
J'ai un problème qui commence sérieusement à m'énerver.
Je réalise actuellement un projet qui sert à modifier le thème usplash sur unix. Donc j'ai besoin d'une structure de type Thème.
 
Je vous mets ce que j'ai réalisé pour le moment.
 
Le .h :

Code :
  1. #ifndef DEF_FONCTIONS
  2. #define DEF_FONCTIONS
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include <string.h>
  6. struct Theme{
  7.     char* nom;
  8.     char* cheminAcces;
  9.     char* cheminImage;
  10. };
  11. typedef struct Theme Theme;
  12. Theme creerTheme(char* nomT, char* cheminT, char* cheminImageT);
  13. void ajouterTheme(char* nomT, char* cheminT, char* cheminImageT, FILE* f);
  14. void supprimerTheme(Theme th, FILE* f);
  15. void chargerConfig(Theme* theme, FILE* f);
  16. void installerTheme(Theme th);
  17. void valider();
  18. void afficherMiniature(Theme th);
  19. #endif // FONCTIONS_H_INCLUDED


 
Fonctions.c

Code :
  1. #include "fonctions.h"
  2. #include <process.h>
  3. Theme creerTheme(char* nomT, char* cheminT, char* cheminImageT) {
  4.     Theme th;
  5.     th.nom = nomT;
  6.     th.cheminAcces = cheminT;
  7.     th.cheminImage = cheminImageT;
  8.     return th;
  9. }
  10. void ajouterTheme(char* nomT, char* cheminT, char* cheminImageT, FILE* f) {
  11.     Theme th = creerTheme(nomT, cheminT, cheminImageT);
  12.     f = fopen("Theme.txt","ab" );
  13.     fwrite(&th,sizeof(Theme),1,f);
  14.     fclose(f);
  15. }
  16. void chargerConfig(Theme* theme, FILE* f) {
  17.     int t, i = 0;
  18.     Theme th;
  19.     f = fopen("Theme.txt","rb" );
  20.     while (i < 30) {
  21.         fseek(f,i*sizeof(Theme),SEEK_SET);
  22.         t = fread (&th,sizeof(Theme),1,f);
  23.         if (t != 0) {
  24.             theme[i] = th;
  25.         } else {
  26.             break;
  27.         }
  28.         theme ++;
  29.         i++;
  30.     }
  31.     fclose(f);
  32. }
  33. void supprimerTheme(Theme th, FILE* f) {
  34. }
  35. void installerTheme(Theme th) {
  36.     system ( "sudo cp \"/home/utoto/chemin_vers_theme/mon_theme.so\" /usr/lib/usplash/" ) ;
  37.     system ( "sudo update-alternatives --install /usr/lib/usplash/usplash-artwork.so usplash-artwork.so \"/usr/lib/usplash/mon_theme.so\" 10" ) ;
  38.     system ( "sudo update-alternatives --config usplash-artwork.so" ) ;
  39.     system ( "sudo update-initramfs -u" ) ;
  40. }
  41. void valider() {
  42.     printf("Vous avez réalisé l'option avec succès !" );
  43.     //on ferme la fenetre
  44. }
  45. void afficherMiniature(Theme th) {
  46.     //on affiche une miniature du theme a installer
  47. }


 
Main.c

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "fonctions.h"
  4. int main()
  5. {
  6.     int choix;
  7.     FILE* fichier;
  8.     Theme theme[30];
  9.     chargerConfig(theme, fichier);
  10.     Theme th;
  11.     char* nom = "Marrant";
  12.     char* cheminA = "C:\\Programmes\\";
  13.     char* cheminImageA = "C:/Programmes/Images";
  14.     printf("\t\tMenu, veuillez choisir une option\n\n1) Fonction ajouter un theme\n2) Fonction supprimer un theme\n3) Fonction installer un theme\n4) Fonction valider\n5) Fonction afficher miniature theme\n" );
  15.     scanf("%ld", &choix);
  16.     switch(choix) {
  17.     case 1:
  18.         ajouterTheme(nom, cheminA, cheminImageA, fichier);
  19.         break;
  20.     case 2:
  21.         supprimerTheme(th, fichier);
  22.         break;
  23.     case 3:
  24.         installerTheme(th);
  25.         break;
  26.     case 4:
  27.         valider();
  28.         break;
  29.     case 5:
  30.         afficherMiniature(th);
  31.         break;
  32.     default:
  33.         printf("Votre choix n'est pas valide..." );
  34.     }
  35.     return (0);
  36. }


 
Je vous avoue que j'ai vraiment besoin d'aide  :cry:  
 
 
 

Reply

Marsh Posté le 22-02-2008 à 19:18:40   

Reply

Marsh Posté le 22-02-2008 à 21:59:59    

quel est le problème ?

Reply

Marsh Posté le 22-02-2008 à 22:27:41    

djobidjoba a écrit :

quel est le problème ?


 
Hmm, déjà, quand je vois ça :
 

Code :
  1. fwrite(&th,sizeof(Theme),1,f);
  2. fread (&th,sizeof(Theme),1,f);


 
Avec des champs contenants des "char *", c'est mal barré pour que ça fonctionne.  :sweat:
 
Révise ta notion des pointeurs, et de pourquoi il ne peuvent pas être écrit tel quel dans des fichiers.

Reply

Marsh Posté le 23-02-2008 à 09:06:46    

tpierron a écrit :

 

Hmm, déjà, quand je vois ça :

 
Code :
  1. fwrite(&th,sizeof(Theme),1,f);
  2. fread (&th,sizeof(Theme),1,f);
 

Avec des champs contenants des "char *", c'est mal barré pour que ça fonctionne.  :sweat:

 

Révise ta notion des pointeurs, et de pourquoi il ne peuvent pas être écrit tel quel dans des fichiers.

 

Exact j'ai tout modifié avec des tableaux, je m'étais gourré de sens à l'origine (char[30] nom par exemple au lieu de char nom[30] à cause de JAVA >.< ).

 

Fin bref ça enregistre bien mais ça me rajoute pleins de caractères bizarres en plus de ce que je veux (Marrant        ! C:\Programmes\  ›!        ¸ uDê" ê kvì" $    
 þÿÿÿG$°wC:/Programmes/Images    $    åtv     åtv$   Xë" =èkv
 ˜ë" ), comment faire pour les enlever ?


Message édité par Angelfire54 le 23-02-2008 à 09:25:32
Reply

Marsh Posté le 23-02-2008 à 09:24:38    

you failed :o
 
si ta structure contient des pointeurs qui eux même contiennent des données, les données vont pas magiquement se sauver. Il faut que tu écrive une fonction qui sérialise récursivement ta structure.

Reply

Marsh Posté le 23-02-2008 à 11:43:44    

Oui mais là, il récupère bien les champs comme je veux, donc je pense que c'est bon, ça à l'air de fonctionner xD

Reply

Marsh Posté le 23-02-2008 à 13:14:18    

Angelfire54 a écrit :

Oui mais là, il récupère bien les champs comme je veux, donc je pense que c'est bon, ça à l'air de fonctionner xD


Dehors.  :fou:  
 
Mais nom de nom, quand est-ce que les gens comprendront que c'est pas parce que ca marche que c'est correct?  :fou:  :fou:  :fou:


Message édité par Ace17 le 23-02-2008 à 16:30:06
Reply

Marsh Posté le 23-02-2008 à 13:14:35    

soit tu sauvegardes la taille réelle des chaines (strlen) soit tu sauvegardes le contenu entier de la variable. Dans le dernier cas, il y a des caractères après les fins de chaines qui étaient en mémoire lors de la déclaration.
lorsque que tu dis "il récupère bien les champs comme je veux", en fait tu devrais dire "il affiche bien les champs comme je veux" car ton printf affiche une chaine terminée par un caractère de fin de chaine.
si malgré tout tu souhaite avoir une sauvegarde sans caractères parasites, il faut initialiser tes champs avec des 0 (memset(th.nom,0,siseof(th.nom)))

 


Message édité par djobidjoba le 23-02-2008 à 13:16:31
Reply

Marsh Posté le 23-02-2008 à 14:56:38    

Comment faire pour vérifier que theme[i] n'est pas nul et contient bien un thème ?

 

Parce que dans la fonction qui suit, tout est enregistrés même si theme[i] est nul :

 

void enregistrerConfig(Theme theme[]) {
    FILE* f;
    int t, i = 0;
    f = fopen("Theme.txt","wb" );
    while (i < 30) {
        printf("%s", theme[i].nom);
        fseek(f,i*sizeof(Theme),SEEK_SET);
        fwrite (&theme[i],sizeof(Theme),1,f);
        i++;
    }
    fclose(f);
}

 

Je dois rajouter if (theme[i] ... ??


Message édité par Angelfire54 le 23-02-2008 à 17:57:41
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed