Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1176 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Sauvegarder et charger des objets dans un fichier.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Sauvegarder et charger des objets dans un fichier.

n°1690975
Angelfire5​4
Posté le 22-02-2008 à 19:18:40  profilanswer
 

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:  
 
 
 

mood
Publicité
Posté le 22-02-2008 à 19:18:40  profilanswer
 

n°1691065
djobidjoba
Posté le 22-02-2008 à 21:59:59  profilanswer
 

quel est le problème ?

n°1691074
tpierron
Posté le 22-02-2008 à 22:27:41  profilanswer
 

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.

n°1691149
Angelfire5​4
Posté le 23-02-2008 à 09:06:46  profilanswer
 

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
n°1691155
Joel F
Real men use unique_ptr
Posté le 23-02-2008 à 09:24:38  profilanswer
 

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.

n°1691187
Angelfire5​4
Posté le 23-02-2008 à 11:43:44  profilanswer
 

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

n°1691212
Ace17
Posté le 23-02-2008 à 13:14:18  profilanswer
 

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
n°1691213
djobidjoba
Posté le 23-02-2008 à 13:14:35  profilanswer
 

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
n°1691257
Angelfire5​4
Posté le 23-02-2008 à 14:56:38  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Sauvegarder et charger des objets dans un fichier.

 

Sujets relatifs
Sélectionner une colonne de données à partir d'un fichier TXTlecture de fichier
Lire un fichier .txtRecherche de fichier
Recherche de fichier, copie à l'aide d'une listeExapmle de creation de fichier JNI
Envois de mails avec fichier(s) attache(s)Perl XSL, ne trouve pas le fichier xsl
Lecture fichier csvTransfert de fichier de PDA vers serveur sans Wifi
Plus de sujets relatifs à : Sauvegarder et charger des objets dans un fichier.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR