Parcours d'arbre et écriture dans un fichier

a marqué ce sujet comme résolu.

Bonjour à tous !

J’essaye de réaliser une fonction en C qui devra effectuer un parcours infixe d’un arbre tout en écrivant chaque caractère lu dans un fichier. Cependant j’ai un problème : le parcours est bien celui que je souhaite mais l’ordre d’écriture dans le fichier n’est pas le même que l’ordre de parcours. J’ai ici un arbre à 3 noeuds dont le noeud racine est étiquetté par '+’, le fils droit par '2' et le fils gauche par '6’. Je souhaiterai que ma fonction écrive dans le fichier dans cette ordre : '2’,'+’,'6' mais elle écrit : '2’,'6’,'+’. J’ai donc rajouté un printf du caractère courant dans la fonction et ce printf affiche bien l’ordre que j’attends !

Voici le code de la fonction :

void parcours_infixe(noeud* racine, char* file_name)
{
  FILE* mon_flux=fopen(file_name,"a");
  if(racine!=NULL){
    parcours_infixe(racine->filsG,file_name);
    printf("%c",racine->val);
    fputc(racine->val,mon_flux);
    parcours_infixe(racine->filsD,file_name);
  }
  fclose(mon_flux);
}

Voici ce que rend l’execution de la fonction (donc les appels à printf()) :

2+6

Et voici ce que contient le fichier "test2.txt" :

26+

Merci d’avance pour votre aide ;)

Ici, tu ouvres ton fichier plein de fois, tu le fermes plein de fois… mais pas séquentiellement.

Tu fais quelque chose comme ça :

Ouvre 2
ecrit 2
Ouvre +
ecrit +
Ouvre 6
écrit 6
Ferme 2
Ferme 6 
Ferme +

Le système d’exploitation écrit au dernier moment, il n’écrit pas quand il passe sur l’instruction fputc(), mais quand il passe sur l’instruction fclose().

Une possibilité, c’est d’ouvrir le fichier une fois pour toutes, dans le main() en gros. Et ensuite, dans ta fonction récursive, tu utilises ton pointeur de fichier (qui est donc unique).

Ou peut-être , autre possibilité, après chaque fputc(), ajouter une instruction de type flush() pour forcer l’écriture immédiate de cette partie. J’imagine que l’instruction flush() ou fflush() existe en C.

Mais la solution propre, c’est clairement de faire en sorte que le fichier soit ouvert une seule fois et fermé une seule fois.

+1 -0

D’accord merci beaucoup, je pensais que les caractères étaient écrit directement dans le fichier, j’avais oublié qu’ils étaient stockés dans un tampon avant ! J’ai donc fait ta première solution en appelant la fonction avec un pointeur de fichier et cela marche niquel !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte