Langage C: écriture dans un fichier

Sportif_C -  
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je suis entrain d'écrire un programme qui permet de lister toutes les combinaisons possibles avec 3 numéros. Pour ça j'ai utilisé une méthode récursive.
J'ai un petit souci: c'est a quelle moment je dois fermer mon fichier! En fait, je voudrais écrire les résultants dans un fichier texte "CombinationsFile.txt". Chaque combinaison est sur une ligne.
J'ai un petit souci:je ne sais pas à quelle moment je dois fermer mon fichier!
Quelqu'un pourrait-il m'aider?
Merci.



void combinaisons(int n, int p, int k, int *L, int *t, int r) {
	int i, j, j1, t2[n];
	CombinationsFile=fopen("Combinations.txt","w");
     if(CombinationsFile==NULL)
     {
          printf("Failed to open  Combinations file, quitting!\n");
          exit(1);
     }

	if(r<p-k) return;
	if(k==p) {
		for(i=0;i<p;i++) 
		fprintf(CombinationsFile,"%d ", L[i] );
		printf("\n");

		return;
	}

	for(i=0;i<r;i++) {

               L[k] = t[i];

               for(j=i+1, j1=0;j<r;j++, j1++) {
			t2[j1] = t[j];

		}
		combinaisons(n, p, k+1, L, t2, j1);

	}

}
A voir également:

1 réponse

Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
tu fermes ton fichier lorsque tu n'en as plus besoin, donc dans ton cas, juste à la fin de ta fonction.
0
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
pardon, je dis une bêtise bien évidemment.

A cause des appels récursifs, je n'arrive pas à y voir clair, tout comme toi je pense.


une meilleure stratégie, plus *réutilisable* (si tu veux changer le nom du fichier, etc...) et plus pratique dans ce cas, serait de mettre CombinationsFile=fopen("Combinations.txt","w");
dans le main, ou autre fonction qui appelle celle que tu nous montres, et passer cette variable en *paramètre* en plus pour ta fonction récursive.

Ainsi tu ouvres le fichier avant d'appeler la première fois ta fonction, tu transmets le descripteur par argument, et tu fermes le fichier après l'appel initial.
0
Sportif_C
 
Merci pour ta réponse.
J'ai fais comme tu m'as demandé(enfin je pense). mais ça marche pas.Pourrais-tu STP essayer d'exécuter le programme et me dire ce que tu en penses?Merci encore.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE * CombinationsFile;

void combinaisons(FILE *CombinationsFile, int *ens, int *combinaison, int n, int p, int i, int t, void (*func)(int*,int) ) {
    if (i<p) {
        int k;
        for (k=t; k<n; k++) {
            combinaison[i] = ens[k];
            combinaisons(CombinationsFile,ens,combinaison,n,p,i+1,k+1,func);
        }
    }
    else {
        func(combinaison,p);


    }
}

void afficher( int *p, int n) {
  int i;
  for (i = 0; i < n; i++) printf("%d ", p[i]);
  printf("\n");
}



int main() {
  int ens[] = {1,2,3,4,5,6};
  int combi[4];
  CombinationsFile=fopen("Combinations.txt","w");
     if(CombinationsFile==NULL)
     {
          printf("Failed to open  Combinations file, quitting!\n");
          exit(1);
     }

     combinaisons(CombinationsFile, ens,combi,6,4,0,0,afficher);
     fclose(CombinationsFile);
}
0
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
je ne comprends pas ça :

func(combinaison,p);
0
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
et la variable :

FILE * CombinationsFile;

je la déclarerais plutot dans le main, juste pour éviter la confusion avec les arguments.
0