IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Forcer le vidage du buffer d'écriture (flush)


Sujet :

Fortran

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Forcer le vidage du buffer d'écriture (flush)
    Bonjour,

    je chercher à contrôler le vidage du buffer d'écriture dans un fichier (flush).

    Mais d'après mes recherches, cette fonction n'existe pas dans le standard Fortran 90 (peut-être en Fortran 2003?...).

    La première solution (si on peut appeler ça une soluiton... ) serait de fermer et de rouvrir le fichier...

    La deuxième serait d'appeler une fonction d'un autre langage qui ferait ceci. Ma dll Fortran s'interface avec une application C#. Quelqu'un saurait-il comment, en C#, identifier le buffer associé à l'unité logique de mon fichier, et faire ensuite le flush de ce buffer?...

    Merci!

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par YOY205
    je chercher à contrôler le vidage du buffer d'écriture dans un fichier (flush).
    La solution la plus portable est en effet de fermer et ré-ouvrir le fichier. Ce n'est pas scandaleux de la faire ! Ne pas faire cela a chaque ecriture, cependant, puisque les performances du programme s'effondrent.
    La meilleure solution est bien sur d'ecrire un programme independant du timing d'ecriture des fichiers, mais ce n'est pas toujours possible (meme si des scripts peuvent toujours verifier exterieurement si un fichier a ete mis a jour ou non).

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par DaZumba
    La solution la plus portable est en effet de fermer et ré-ouvrir le fichier.
    Merci. Je peux conserver cette solution pour assurer la portabilité. Mais au niveau des performances, n'est-ce pas beaucoup plus lourd qu'un flush?

    Citation Envoyé par DaZumba
    La meilleure solution est bien sur d'ecrire un programme independant du timing d'ecriture des fichiers, mais ce n'est pas toujours possible.
    Le fichier en question est un fichier de trace, dont le contenu est partiellement perdu (la partie encore dans le buffer) lorsque l'application n'est pas arrêtée proprement. On me demande, pour un niveau de trace maximum (c-à-d occasionnellement), de faire le flush systématique de ce fichier de trace pour savoir exactement à quel endroit le programme s'est interrompu.
    Je ne pense donc pas pouvoir m'affranchir du timing d'écriture du fichier?

    Et encore merci d'avoir répondu aussi rapidement!

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par YOY205
    Merci. Je peux conserver cette solution pour assurer la portabilité. Mais au niveau des performances, n'est-ce pas beaucoup plus lourd qu'un flush?
    C'est difficile a dire. Il faudrait faire la comparaison avec un programme C qui fflush() le flux ouvert [*] ou avec un programme en Fortran GNU (on dispose alors de la fonction intrinseque flush, mais ce n'est pas portable, evidemment). Ce qui est certain, c'est que forcer le flush va degrader les performances du programme. On n'a pas invente l'ecriture bufferisee pour rien ! Malheureusement, c'est peut etre la seule solution portable a ton probleme. Mais tu peux toujours proteger ton flush par un logical qui n'est mis a .true. qu'en mode 'debug'...[*] On pourrait contourner le probleme en ecrivant une petite fonction C, appelee depuis le Fortran, qui fflush() le flux ouvert. Malheureusement, le Fortran utilise un descripteur de fichiers (un entier) alors que fflush() attend un pointeur de type opaque FILE et je ne connais pas la routine de bas niveau correspondant a fflush().
    Par contre, si tu ecris sur l'unite 6 (stdout par defaut), alors le fflush() est trivial:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <stdio.h>
     
    void flush_C(void)
    {
      fflush(stdout);
    }
    avec un appel de ce genre en Fortran:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    write(6,*) value
    call flush_C()

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    D'accord merci, j'essaierai donc d'implémenter cette solution et je vous dirai à quel point c'est catastrophique... Je n'aurai pas le temps de faire ça d'ici une semaine ou deux, mais je reviendrai vous dire.

    J'ai trouvé dans la doc du compilateur que j'utilise une fonction qui permettrait de faire le flush, mais elle impose de changer également toutes les fonctions d'ouverture et d'écriture du fichier... Ce serait une solution un peu lourde... et pas du tout portable! Je vais donc en rester à l'open/close exécuté seulement si il le flush est demandé.

    Merci et à bientôt.

Discussions similaires

  1. forcer l'écriture de buffer
    Par sofiane80 dans le forum Bibliothèque standard
    Réponses: 3
    Dernier message: 15/07/2008, 15h48
  2. Forcer l'écriture sur un flux de sortie ?
    Par Alfred83 dans le forum SL & STL
    Réponses: 3
    Dernier message: 29/05/2007, 12h05
  3. Forcer le vidage de la cache
    Par d10g3n dans le forum Flash
    Réponses: 6
    Dernier message: 19/03/2007, 02h06
  4. forcer l'écriture sur 4 positions
    Par dassise dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 26/10/2006, 22h28
  5. forcer l'écriture d'un champ de formulaire
    Par goma771 dans le forum Langage
    Réponses: 7
    Dernier message: 21/02/2006, 18h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo