Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/03/2015, à 22:19

elkev

Priorité des "printf" en C? [RESOLU]

Bonjour à tous,

J'ai une question qui me taraude;
en fait, j'essayais de faire une sortie vers un fichier en envoyant comme argument a une fonction externe pour écrire un tableau, et pouvoir aussi rajouter des variables non tableaux depuis le main dans mon fichier de sortie.

void ecriture (int n, double tableau[n], FILE* pfich)

il se trouve qu'on peut apparemment pas envoyer un pointeur déjà attribué vers un flux a cette fonction (ce que j'ai voulu faire dans le main), donc j'ai laissé tomber cette solution.

j'ai envisagé autre chose ensuite, ce qui est pas extrêmement utile ni malin, mais bon;
disons que j'attribue un nom de fichier de sortie, puis j'ouvre un flux vers ce fichier tant dans le main que dans la procédure "ecriture", qui resseble donc a ça :

void ecriture (int n, double tableau[n], char* lefichier)

bref, je vous copie la partie utile du code (en fait, c'est tout le code, puisque c'est un test pour pouvoir m'en servir dans un programme plus étoffé disons  big_smile ) :

  void ecriture (int n, double tableau[n], char* lenom) {
  
  FILE* pfich = NULL;
  pfich = fopen (lenom, "a");
  
  for (int i=0; i< n; i++) {
    fprintf(pfich, "%lg ", tableau[i]);
  } ;
  
  return;
}

  } ;

et voia le main

int main(void) {
  
  FILE* pfich = NULL;
  char* lenom = "resultats.dat";
  pfich = fopen (lenom, "a");
  
  int n = 4;
  double letab[n];
  
  for (int i=0; i< n; i++){
    letab[i] = i;
  };
  
 
  ecriture(n, letab, lenom);
  fprintf(pfich, "a \n ");
  ecriture(n, letab, lenom);
  
  exit(0);
}

Maintenant, le truc completement effarant, c'est que je récupère ça en sortie dans mon fichier results.dat


0 1 2 3 0 1 2 3 a 

Je me demande donc: y'a-t-il une priorité d'exécution des fonctions sur les fprintf dans le main? il semblerait...

Et comment régler ce souci? puisque j'ai a priori pas forcément envie de faire un retour a la ligne dans m fonction écriture (en fait, j'ai vaiment pas envie, je veux pouvoir concaténer les données du tableau et celles d'autres variables, par exemple des double, sur une même ligne, puis sauter la ligne...)

avez vous des idées?

Merci beaucoup pour votre aide, et bonne soirée à tous.

Cheers

Dernière modification par elkev (Le 22/03/2015, à 11:52)

Hors ligne

#2 Le 21/03/2015, à 22:45

Braun

Re : Priorité des "printf" en C? [RESOLU]

Bonsoir,
Deux détails m'échappent :
1/ Où et quand fermes tu les fichiers ouverts ?
2/ Le même fichier de clef « lenom » est ouvert dans main( ) et dans ecriture( ) ?
J'ai du zapper quelque chose.

Hors ligne

#3 Le 22/03/2015, à 00:13

elkev

Re : Priorité des "printf" en C? [RESOLU]

1) Tu as raison, j'avais oublié de faire fclose; en fait, ça ne change malheureusement pas mon problème....
(j'ai fait close (pfich) à la fin de "ecriture.c" et aussi a la fin de "main.c", juste avant le return et le exit respectivement).
2) oui j'ai bien ouvert le meme fichier dans les deux cas, c'est justement parceque je veux pouvoir écrire une ligne avec
   - le tableau "tableau"
   - la valeur d'une autre variable quelconque (ici, j'ai mis a \n pour le test et pour pouoir changer de ligne "manuellement" entre deux impressions de tableau)

est-ce plus clair?
désolé des imprécisions...

Hors ligne

#4 Le 22/03/2015, à 11:51

elkev

Re : Priorité des "printf" en C? [RESOLU]

Bon,donc la réponse était en effet liée aux ouvertures et fermetures des flux vers le fichier de sortie;
j'ai résolu le problème en faisant ça:

 ecriture(n, letab, lenom);
  
  pfich = fopen (lenom, "a");
  fprintf(pfich, "\n ");
  fclose(pfich);
  
  ecriture(n, letab, lenom);

(rien d'autre n'a changé, j'ai fait le fclose a la fin (juste avant le return) dans "ecriture"). et là j'obtiens bien le résultat escompté

0 1 2 3 
 0 1 2 3 

Merci pour l'aide en tout cas! si quelqu'un connaît une méthode pour pouvoir transmettre le pointeur déjà lancé vers un flux -vers un fichiers donc- à une fonction, comme je pensais le faire au départ, je suis preneur!

Merci à tous.

Hors ligne