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 :

problème : se servir d'un fichier comme tampon


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Par défaut problème : se servir d'un fichier comme tampon
    le contexte :
    j'écris un programme qui permette d'envoyer/recevoir des données par port parallèle (pour une liaison fibre optique).
    Pour l'émission, le programme se contente de dévider un fichier "tampon" en lisant n octets pour les envoyer ; ce sont des programmes fils qui écrivent sur ce fichiers par paquets de n également, avec un système de tickets.
    le principe est le même en réception, le premier des n octets du packet permettant de savoir à qui il est destiné.

    le problème :
    je voudrais que chaque paquet de n octets lus soit effacé (si possible après confirmation de sa bonne réception), afin d'éviter qu'il ne grandisse démesurément et limiter le recours au lseek.
    Est-ce possible sans avoir à recopier byte par byte le fichier dans un fichierbis en excluant ceux déjà lus, et à renommer fichierbis pour retrouver le même nom pour un accès futur?

    En gros, faire comme si on avait une liste qu'on remplissait d'un côté (fin du fichier) et vidait de l'autre (début)

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Tu peux gérer un fichier circulaire.

    Le fichier commence par un en-tête comportant un pointeur de lecture et un pointeur d'écriture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct
    {
      unsigned long plect;
      unsigned long pecr;
    } entete;
    L'en-tête est initialisé (à la création du fichier et à chaque fois que entete.plect==entete.pecr suite à une lecture) à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    entete.plect = sizeof(entete);
    entete.pecr = sizeof(entete);

    L'accès concurrentiel au fichier est géré par lockf (sous Unix. Si tu es sous Windows, utilise des sémaphores).

    Pour écrire:
    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
     
    lseek(fd,0L,SEEK_SET);
    lockf(fd,0L,F_LOCK);
    if (read(fd,&entete,sizeof(entete))!=sizeof(entete))
    {
      entete.plect = sizeof(entete);
      entete.pecr = sizeof(entete);
      lseek(fd,0L,SEEK_SET);
      write(fd,&entete,sizeof(entete));
    }
    lseek(fd,entete.pecr,SEEK_SET); /* edit: manquait 3ème paramètre */
    if (write(fd,donnees,n)==n)
    {
      entete.pecr += n;
      lseek(fd,0L,SEEK_SET);
      write(fd,&entete,sizeof(entete));
    }
    else
    {
      /* à traiter */
    }
    lseek(fd,0L,SEEK_SET);
    lockf(fd,0L,F_ULOCK);
    Pour la lecture:

    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
    lseek(fd,0L,SEEK_SET);
    lockf(fd,0L,F_LOCK);
    if (read(fd,&entete,sizeof(entete))!=sizeof(entete))
    {
      entete.plect = sizeof(entete);
      entete.pecr = sizeof(entete);
      lseek(fd,0L,SEEK_SET);
      write(fd,&entete,sizeof(entete));
    }
    if (entete.plect == entete.pecr)
    {
      /* pas de données */
      entete.plect = entete.pecr = sizeof(entete);
      lseek(fd,0L,SEEK_SET);
      write(fd,&entete,sizeof(entete));
      lseek(fd,0L,SEEK_SET);
      lockf(fd,0L,F_ULOCK);
      return ...;
    }
    else
    {
      lseek(fd,entete.plect,SEEK_SET);  /* edit: manquait 3ème paramètre */
      if (read(fd,donnees,n)==n)
      {
        entete.plect += n;
        lseek(fd,0L,SEEK_SET);
        write(fd,&entete,sizeof(entete));
      }
      lseek(fd,0L,SEEK_SET);
      lockf(fd,0L,F_ULOCK);
    }
    Le fait de réinitialiser plec et pecr à chaque fois que le fichier est vide évite que ce dernier grossisse en permanence.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Par défaut
    merci beaucoup !
    après une première lecture du code, c'est exactement ce dont j'avais besoin

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

Discussions similaires

  1. Réponses: 20
    Dernier message: 22/03/2005, 22h07
  2. Réponses: 2
    Dernier message: 01/06/2004, 13h47
  3. Réponses: 2
    Dernier message: 28/04/2004, 12h25
  4. problème d'acces concurentiel à un fichier
    Par Theoden dans le forum MFC
    Réponses: 2
    Dernier message: 04/03/2004, 10h49
  5. Problème d'E.S. sur fichier avec open
    Par Bubonik software dans le forum C
    Réponses: 6
    Dernier message: 04/02/2004, 20h42

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