Aller au contenu

[C] [C]Ecriture des données sur un fichier


RinDman

Messages recommandés

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à :transpi: )

/*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 :chinois:

Lien vers le commentaire
Partager sur d’autres sites

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

Est - ce que tout ce qui est affiché par la fonction afficheMot sera enregistré dans le fichier ?

Ouais, c'est tordu: :zarb: balancé tout dans le stdout et redirigé ce dernier dans le fichier.

Tu as quoi contre les méthodes fwrite et fprint? :zarb:

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/... :zarb::zarb:

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: :yes: ..... qui n'existe pas en C :siffle:

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

Oui ma question bizarre ( je suis habitué au printf, on m'a pas enseigné les fprintf un peu tard je dirais :reflechis: )

Je pourrais remplacer les printf de ma fonction affiche par des fprintf, ce n'est pas un problème en soi :transpi:

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

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

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

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 ) :chinois:

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 :yes:

PS : Merci pour ton aide :incline::incline:

Lien vers le commentaire
Partager sur d’autres sites

J'ai pensé à cela aussi, un peu moins d'appels: :transpi:

Ensuite on peut faire cela avec un tableau et une boucle pour: :siffle:

Ou alors en itératif: (si c'est possbile) :ouioui:

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...