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

C Discussion :

Rafraichissement de fichier - fprintf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Par défaut Rafraichissement de fichier - fprintf
    Bonjour a tous (desole, clavier anglais, pas trop d accent)

    C est sans doute une question basique ...
    Je realise un programme en C qui lit des donnees recues via un port serie depuis un appareil.
    J effectue un traitement numerique des donnees et exporte les resultats dans un fichier texte avec fprintf (1 ligne de 5 entiers par seconde).
    L’envoi de donnees est continu mais il semble que le fichier est rafraichi toutes les x secondes. Hors, j ai besoin d acceder aux donnes ‘fraiches’ en temps reel.
    1) Est – ce que c’est normal ou est ce que j’ai fait une erreur quelque part ?
    2) Si c’est normal, comment fonctionne le rafraichissement (en fonction du nombre de donnees dans le fichier ou est - ce un rafraichissement periodique ?
    3) Y a t’il une facon de forcer le rafraichissement a chaque ecriture ?

    Merci d’avance
    Patrick

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Comme tu utilises fprintf(), tu utilises un tampon de bufferisation système.

    Tu peux essayer flush(), cela force à vider le tampon.

    Sinon, tu peux aussi essayer avec des appels plus bas niveau (open, write et close). Là, tu ne sera pas embêté avec le buffer.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Sinon, tu peux aussi essayer avec des appels plus bas niveau.
    Ou encore essayer setbuf() !

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    tu peux forcer soi avec fflush ou en terminant ta ligne par un '\n'.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    tu peux forcer soi avec fflush ou en terminant ta ligne par un '\n'.
    Oui, mais ça l'oblige à coller un retour à la ligne et ce n'est pas forcément ce qu'il cherche ...

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut Effet du \n
    Bonsoir,

    merci pour vos réponses. (j'avais oublié de mentionner le fait que je programme sous windows...oups). Vos liens sont très intéressants je vais tester ce qui convient le mieux à mon cas.

    Par contre, tout ce que j'écris dans mes fichiers de sortie se terminent toujours par '\n' mais ces derniers ne semblent pas avoir l'effet 'rafraichissement immédiat mentionné ci dessus.
    Citation Envoyé par souviron34 Voir le message
    tu peux forcer soi avec fflush ou en terminant ta ligne par un '\n'.

    exemple d'export vers un de mes fichiers (1écriture par seconde) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fic,"%2d\t %.2f\t %.2f\n", X, Y, Z);

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    tu peux forcer soi avec fflush ou en terminant ta ligne par un '\n'.
    Pour en être sûr, il faut alors un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setvbuf(fic, NULL, _IOLBF, BUFSIZ);
    (ou en spécifiant un buffer ou une autre taille) après ouverture du fichier et avant toute autre opération dessus.

    Citation Envoyé par Lepapat Voir le message
    Par contre, tout ce que j'écris dans mes fichiers de sortie se terminent toujours par '\n' mais ces derniers ne semblent pas avoir l'effet 'rafraichissement immédiat mentionné ci dessus.
    Changer le mode de gestion du buffer est nécessaire si l'implémentation a déterminé que le flux n'était pas interactif (sauf pour stderr).

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par LePapat26 Voir le message
    Je realise un programme en C qui lit des donnees recues via un port serie depuis un appareil.
    J effectue un traitement numerique des donnees et exporte les resultats dans un fichier texte avec fprintf (1 ligne de 5 entiers par seconde).
    L’envoi de donnees est continu mais il semble que le fichier est rafraichi toutes les x secondes. Hors, j ai besoin d acceder aux donnes ‘fraiches’ en temps reel.
    1) Est – ce que c’est normal ou est ce que j’ai fait une erreur quelque part ?
    2) Si c’est normal, comment fonctionne le rafraichissement (en fonction du nombre de donnees dans le fichier ou est - ce un rafraichissement periodique ?
    3) Y a t’il une facon de forcer le rafraichissement a chaque ecriture ?

    Merci d’avance
    Patrick
    tu fais bien un fclose() après l'écriture ? Note quand même qu'il est possible le fichier soit inaccessible en lecture pendant le temps (très court) de l'écriture.

    Essayons de simuler ça avec des threads ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
     
    /* http://delahaye.emmanuel.free.fr/clib/ */
    #include "psleep/inc/psleep.h"
     
    #define F "donnees.txt"
     
    static void *task_a (void *user)
    {
       int count = 0;
     
       while (1)
       {
          FILE *fp = fopen (F, "w");
          if (fp != NULL)
          {
             printf ("W: count = %d\n", count);
             fprintf (fp, "%d\n", count);
             fclose (fp);
             count++;
          }
          else
          {
             printf ("W: '%s' inaccessible\n", F);
          }
          msleep (1000);
       }
       return NULL;
    }
     
    static void *task_b (void *user)
    {
       while (1)
       {
          FILE *fp = fopen (F, "r");
          if (fp != NULL)
          {
             int count;
             int n = fscanf (fp, "%d", &count);
             fclose (fp);
             if (n == 1)
             {
                printf ("R: count = %d\n", count);
             }
          }
          else
          {
             printf ("R: '%s' inconnu ou inaccessible\n", F);
          }
          msleep (1100);
       }
       return NULL;
    }
     
    int main (void)
    {
       pthread_t ta;
       pthread_t tb;
     
       pthread_create (&ta, NULL, task_a, NULL);
       pthread_create (&tb, NULL, task_b, NULL);
     
       pthread_join (ta, NULL);
       pthread_join (tb, NULL);
     
       return 0;
    }
    Aucun problème avec ça (testé sous Windows Vista SP1). On pourrait raccourcir les temps pour stresser un peu plus le code...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Par défaut fclose
    Oui je fais bien un fclose() de tous mes fichiers de receuil d'information a la fin de tous les traitements.

    Interessants cette notion de thread. Je me suis documente dessus mais je n ai pas encore joue avec. mais le temps est peut etre venu !

    Patrick

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tomcat] Rafraichissement des fichiers JavaScript
    Par guilopouloos dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 18/08/2011, 10h49
  2. Réponses: 2
    Dernier message: 07/05/2007, 08h06
  3. [AJAX] Rafraichissement d'un fichier texte inclu dans une page
    Par gforce dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/01/2007, 11h41
  4. [HTML] rafraichissement de fichiers pdf
    Par nad dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 29/09/2005, 11h56
  5. Pb fprintf, fscanf pour un fichier .txt
    Par GeekMéPaTrop dans le forum C
    Réponses: 8
    Dernier message: 23/09/2005, 18h57

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