RinDman Posté(e) le 20 novembre 2011 Partager Posté(e) le 20 novembre 2011 Bonsoir à tous ! Voilà j'ai un petit projet en C à faire et j'en suis à l'étape de la sauvegarde sur un fichier *.DICO Mon projet a pour but de créer des arbres ternaire lexicographiques ( 3 pointeurs fils, freredroite, freregauche et une champ char lettre pour contenir un caractère ) Bref, je sais pas utiliser quelle fonction pour écrire de dans, le plus simple pour moi serait d'appeller ma fonction affichemot pour écrire les données directement dans le fichier, ainsi on pourra voir les mots dans l'ordre alphabétique : Voici les info : Arbre est le type utilisé pour ma structure : typedef struct noeud { char lettre; struct noeud *freredroit, *fils, *freregauche; } Noeud, *Arbre; /* le prototype d'affichage*/ void afficheMot(Arbre A); Et voici le début de ma fonction ( je suis un gros newbie en C, d'ailleurs on est obligé de commencer par là ) /*Fonction de sauvegarde d'un arbre*/ /*on prendre l'arbre et le nom du fichier de sauvegarde*/ void sauvegardeLexique(Arbre A, char name) { printf("Entrer le nom du fichier sauvegarder :\n"); char local[20]; FILE* fichier = NULL; fichier=fopen(fgets(local, sizeof(local), stdin).DICO, "w+"); /*on teste si l'ouverture est reussie*/ if(fichier != NULL) { /* quelle fonction permet de lire les flux sortant d'une fonction appellée ? fputc, fget ( fonction afficheMot(A), fichier )*/ fclose(fichier); } else { printf("Impossible d'ouvrir un fichier.\n"); } } Je vous remercie d'avance Lien vers le commentaire Partager sur d’autres sites More sharing options...
RinDman Posté(e) le 20 novembre 2011 Auteur Partager Posté(e) le 20 novembre 2011 Bon voilà une petite correction pour le nom du fichier : /*Fonction de sauvegarde d'un arbre*/ /*on prendre l'arbre et le nom du fichier de sauvegarde*/ void sauvegardeLexique(Arbre A, FILE *pf) { char buff[20]; char nom[20]; int i=0; printf("Entrer le nom du fichier sauvegarder :\n"); scanf("%s",nom); char format[5+1]={'.', 'D','I','C','O' }; strcat(nom,format); pf=fopen(nom, "w+"); /*on teste si l'ouverture est reussie*/ if(pf != NULL) { afficheMot(A,buff,i); fropen(fichier,stdout); fclose(fichier); } else { printf("Impossible d'ouvrir un fichier.\n"); } } Est - ce que tout ce qui est affiché par la fonction afficheMot sera enregistré dans le fichier ? Serait-il préférable d'écrire tout en binaire sur le fichier ? Pour le lire, on pourrait lire chaque octet avec quelle fonction ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
foetus Posté(e) le 21 novembre 2011 Partager Posté(e) le 21 novembre 2011 Est - ce que tout ce qui est affiché par la fonction afficheMot sera enregistré dans le fichier ? Ouais, c'est tordu: balancé tout dans le stdout et redirigé ce dernier dans le fichier. Tu as quoi contre les méthodes fwrite et fprint? Tu fais déjà un parcours de ton arbre (main droite/gauche ou post/pré-fixe): tu replaces tes appels de méthode printf par des appels fwrite/fprint/... Serait-il préférable d'écrire tout en binaire sur le fichier ? Pour le lire, on pourrait lire chaque octet avec quelle fonction ? Cela s'appelle la sérialisation: ..... qui n'existe pas en C Cela dépend de toi: si tu veux qu'il soit lisible par un être humain ou pas, si tu veux une taille minimale ou pas, si tu vas le donner à "manger" à un autre logiciel (format XML, HTML ou CSV par exemple)... Lien vers le commentaire Partager sur d’autres sites More sharing options...
RinDman Posté(e) le 21 novembre 2011 Auteur Partager Posté(e) le 21 novembre 2011 Oui ma question bizarre ( je suis habitué au printf, on m'a pas enseigné les fprintf un peu tard je dirais ) Je pourrais remplacer les printf de ma fonction affiche par des fprintf, ce n'est pas un problème en soi Par exemple j'ai ajouté : le, la, les, un, de, des, en ... Donc en gros ma fonction afficheMot ( préfixe récursif et grâce à un tableau en buffer ) donne par ex : le '\0' ( un espace \n ou 0 puisque c'est nulle ) la \0 les\0 etc ... et dans mon fichier *.DICO il doit y contenir en octet : ld\ne\0\n\ne\n\0\n\ne\n\0s\n\0\n\n\n\n Lien vers le commentaire Partager sur d’autres sites More sharing options...
foetus Posté(e) le 21 novembre 2011 Partager Posté(e) le 21 novembre 2011 Par exemple j'ai ajouté : le, la, les, un, de, des, en ... ..... et dans mon fichier *.DICO il doit y contenir en octet : ld\ne\0\n\ne\n\0\n\ne\n\0s\n\0\n\n\n\n Là je suis largué Lien vers le commentaire Partager sur d’autres sites More sharing options...
RinDman Posté(e) le 21 novembre 2011 Auteur Partager Posté(e) le 21 novembre 2011 void sauvegardeDICO(FILE * file, Arbre A) { if (A == NULL) { fprintf(file, "\\"); fprintf(file,"n"); } else { /*ce qui ne fonctionne pas if (A -> lettre != '\0') {*/ fprintf(file, "%c", A -> lettre); /*else { fprintf(file, "\\"); fprintf(file, "0"); }*/ if (A -> freregauche != NULL) { sauvegardeDICO(file, A -> freregauche); } if (A -> fils != NULL) { sauvegardeDICO(file, A -> fils); } if (A -> freredroit != NULL) { sauvegardeDICO(file, A -> freredroit); } } } Lien vers le commentaire Partager sur d’autres sites More sharing options...
RinDman Posté(e) le 21 novembre 2011 Auteur Partager Posté(e) le 21 novembre 2011 En fait le fichier tel qu'on doit le voir : ld e s e e n ea e s Là où il y les sauts, le vide c'est les octet de 0_n et \n. Selon la version qu'on veut voir on peut afficher les \n et \0 sans sauter à la ligne. Lien vers le commentaire Partager sur d’autres sites More sharing options...
foetus Posté(e) le 21 novembre 2011 Partager Posté(e) le 21 novembre 2011 Si c'est un problème "\\n", pour moi c'est ultra-normal: parce que tu testes NULL sur le freregauche, fils et freredroit avant de lancer la récursion que tu n'as pas les "\\n". Donc soit tu fais du code sale pour ne pas faire une appel pour rien, soit tu fais un truc style: void sauvegardeDICO(FILE * file, Arbre A) { if (A == NULL) { fprintf(file, "\\n"); } else { fprintf(file, "%c", A -> lettre); sauvegardeDICO(file, A -> freregauche); sauvegardeDICO(file, A -> fils); sauvegardeDICO(file, A -> freredroit); }} Lien vers le commentaire Partager sur d’autres sites More sharing options...
RinDman Posté(e) le 21 novembre 2011 Auteur Partager Posté(e) le 21 novembre 2011 Yep ! C'est ce que je me suis dit autant faire un simple appel préfixe sans buffer ( la fonction afficheMot avait un buffer pour recopier le préfixe et s'ajoute aux reste ) Et le fichier sauvegardé affiche bien ce que je voulais. Me reste plus qu'à écrire une fonction qui lit ce fichier pour recréer l'arbre ! Je vous tiens au jus PS : Merci pour ton aide Lien vers le commentaire Partager sur d’autres sites More sharing options...
foetus Posté(e) le 21 novembre 2011 Partager Posté(e) le 21 novembre 2011 J'ai pensé à cela aussi, un peu moins d'appels: Ensuite on peut faire cela avec un tableau et une boucle pour: Ou alors en itératif: (si c'est possbile) void sauvegardeDICO(FILE * file, Arbre A) { if (A == NULL) { fprintf(file, "\\n"); return; } fprintf(file, "%c", A -> lettre); if (A->freregauche != NULL) { sauvegardeDICO(file, A->freregauche); } else { fprintf(file, "\\n"); } if (A->fils != NULL) { sauvegardeDICO(file, A->fils); } else { fprintf(file, "\\n"); } if (A->freredroit != NULL) { sauvegardeDICO(file, A->freredroit); } else { fprintf(file, "\\n"); }} Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.