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 double tampon


Sujet :

C++

  1. #1
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Billets dans le blog
    16
    Par défaut problème double tampon
    bonjour,

    j'ai un problème avec un buffer de 10 caractères.
    les caractères d'indice 4 et 9 sont des sentinelles (EOF)
    j'utilise le mode ios::binary pour lire le fichier par blocs de caractères
    la fonction carSuiv() répond à mes attente.
    par contre, dans la fonction reculer(), l'appel de la méthode "f.read(tampon+SENTINELLE1+1,TAILLEDEMITAMPON) fait comme si elle n'était pas appelée
    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
    71
    72
    73
    74
    75
    76
    #define SENTINELLE1 4
    #define SENTINELLE2 9
    #define TAILLEDEMITAMPON 4
    #define TAILLETAMPON 10
     
    char tampon[TAILLETAMPON];
    int block(0),enAvant(0);
     
    char c;
    ifstream f;
     
    void carSuiv();
    void reculer();
     
    int main(void){
       int taille,i;
       for(i=0;i<TAILLETAMPON;i++)
          tampon[i]=EOF;
       f.open("exemple.ors",ios::in | ios::binary);
       if(f.is_open()){
          f.read(tampon,TAILLEDEMITAMPON);
          for(i=0;c!=EOF;i++){
             carSuiv();
             if(c!=EOF)
                cout<<c;
          }
          reculer();
          while(i>1){
             reculer();
             carSuiv();
             if(c!=EOF)
                cout<<c;
             reculer();
             i--;
          }
          cout<<endl;
          f.close();
       }
    }
    void carSuiv(){
       if(tampon[enAvant]==EOF)
          if(enAvant==SENTINELLE1){
             for(int i(SENTINELLE1+1);i<TAILLETAMPON;i++)
                tampon[i]=EOF;
             f.read(tampon+SENTINELLE1+1,TAILLEDEMITAMPON);
             block++;
             enAvant++;
          }
          else if(enAvant==SENTINELLE2){
             for(int i(0);i<SENTINELLE1;i++)
                tampon[i]=EOF;
             f.read(tampon,TAILLEDEMITAMPON);
             block++;
             enAvant=0;
          }
       c=tampon[enAvant++];
    }
     
    void reculer(){
       enAvant--;
       if(enAvant==-1)
          if(block!=0){
             block--;
             f.seekg(block*TAILLEDEMITAMPON,ios::beg);
             f.read(tampon+SENTINELLE1+1,TAILLEDEMITAMPON);
             enAvant=SENTINELLE2-1;
          }
          else
             enAvant=0;
       else if(enAvant==SENTINELLE1){
          block--;
          f.seekg(block*TAILLEDEMITAMPON,ios::beg);
          f.read(tampon,TAILLEDEMITAMPON);
          enAvant--;
       }
    }
    quelqu'un a une idée?

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Salut,

    J'ai un peu de mal avec ton algo. Tu l'as mis sur papier avant de l'écrire ?

    Dans reculer : "if(enAvant==-1)", je pense que cette condition est vraie si ton fichier est vide.

  3. #3
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Billets dans le blog
    16
    Par défaut
    meci pour la réponse.

    le fichier n'est pas vide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1 ou 7 et 5 + 3 - 2 * 4 / 6 + -1 * +9 - non 8
    enAvant peut-être égal à -1 si il vaut zéro et a été décrémenté avec enAvant--.

    le but de cet algo est de parcourir un fichier en avant ou en arrière.
    lorsque l'on avance et que l'on arrive à SENTINELLE1, la deuxième moitié du tampon est chargé. idem pour les deux moitiés en avant et en arrière.

    avec gdb, je me suis aperçu que lorsque l'on arrive, en arrière, au début de la première moitié du tampon, la deuxième moitié n'est pas chargé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ ./lexical
    1 ou 7 et 5 + 3 - 2 * 4 / 6 + -1 * +9 - non 8
     
    8 non
    8 non
    8 non
    8 non
    8 non
    8 non
    extrait de gdb:
    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
    34	         reculer();
    3: block = 10
    2: tampon = "non \377\070\n\377\377\377"
    1: enAvant = 0
    (gdb) 
    reculer () at analex.cpp:279
    279	   enAvant--;
    3: block = 10
    2: tampon = "non \377\070\n\377\377\377"
    1: enAvant = 0
    (gdb) 
    280	   if(enAvant==-1)
    3: block = 10
    2: tampon = "non \377\070\n\377\377\377"
    1: enAvant = -1
    (gdb) 
    281	      if(block!=0){
    3: block = 10
    2: tampon = "non \377\070\n\377\377\377"
    1: enAvant = -1
    (gdb) 
    282	         block--;
    3: block = 10
    2: tampon = "non \377\070\n\377\377\377"
    1: enAvant = -1
    (gdb) 
    283	         f.seekg(block*TAILLEDEMITAMPON,ios::beg);
    3: block = 9
    2: tampon = "non \377\070\n\377\377\377"
    1: enAvant = -1
    (gdb) 
    284	         f.read(tampon+SENTINELLE1+1,TAILLEDEMITAMPON);
    3: block = 9
    2: tampon = "non \377\070\n\377\377\377"
    1: enAvant = -1
    (gdb) 
    285	         enAvant=SENTINELLE2-1;
    3: block = 9
    2: tampon = "non \377\070\n\377\377\377"
    1: enAvant = -1
    on vois ici que la deuxième moitié du tampon n'est pas chargé (read a ètè ignoré).
    pourquoi cela?

  4. #4
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Billets dans le blog
    16
    Par défaut
    salut à tous,

    j'ai trouvé la solution à ce problème dans les deux dernières questions de la FAQ.
    il suffisait juste de placer un "f.clear()" après chaque lecture
    maintenant ça marche, je vais pouvoir continuer dans mon projet.
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include <fstream>
    #include <iostream>
    using namespace std;
     
    #define SENTINELLE1 4
    #define SENTINELLE2 9
    #define TAILLEDEMITAMPON 4
    #define TAILLETAMPON 10
     
    char tampon[TAILLETAMPON];
    int block(0),enAvant(0);
    char c;
    ifstream f;
     
    void carSuiv();
    void reculer();
     
    int main(void){
       int taille,i;
       for(i=0;i<TAILLETAMPON;i++)
          tampon[i]=EOF;
       f.open("exemple.ors",ios::in | ios::binary);
       if(f.is_open()){
          f.read(tampon,TAILLEDEMITAMPON);
          f.clear();
          for(i=0;c!=EOF;i++){
             carSuiv();
             if(c!=EOF)
                cout<<c;
          }
          reculer();
          while(i>1){
             reculer();
             carSuiv();
             if(c!=EOF)
                cout<<c;
             reculer();
             i--;
          }
          cout<<endl;
          f.close();
       }
    }
     
     
    void carSuiv(){
       if(tampon[enAvant]==EOF)
          if(enAvant==SENTINELLE1){
             for(int i(SENTINELLE1+1);i<TAILLETAMPON;i++)
                tampon[i]=EOF;
             f.read(tampon+SENTINELLE1+1,TAILLEDEMITAMPON);
             f.clear();
             block++;
             enAvant++;
          }
          else if(enAvant==SENTINELLE2){
             for(int i(0);i<SENTINELLE1;i++)
                tampon[i]=EOF;
             f.read(tampon,TAILLEDEMITAMPON);
             f.clear();
             block++;
             enAvant=0;
          }
       c=tampon[enAvant++];
    }
     
    void reculer(){
       enAvant--;
       if(enAvant==-1)
          if(block!=0){
             block--;
             f.seekg(block*TAILLEDEMITAMPON,ios::beg);
             f.read(tampon+SENTINELLE1+1,TAILLEDEMITAMPON);
             f.clear();
             enAvant=SENTINELLE2-1;
          }
          else
             enAvant=0;
       else if(enAvant==SENTINELLE1){
          block--;
          f.seekg(block*TAILLEDEMITAMPON ,ios::beg);
          f.read(tampon,TAILLEDEMITAMPON);
          f.clear();
          enAvant--;
       }
    }
    l’exécution provisoire de ce main() donne pour l'instant ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ ./lexical
    1 ou 7 et 5 + 3 - 2 * 4 / 6 + -1 * +9 - non 8
     
    8 non - 9+ * 1- + 6 / 4 * 2 - 3 + 5 te 7 uo 1
    si ça peut aider quelqu'un

  5. #5
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Billets dans le blog
    16
    Par défaut
    voici la version actuelle:
    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
    void carSuiv(){
       if(tampon[enAvant]==EOF){
          if(enAvant==STN1){
             charger2();
             enAvant++;
             c=tampon[enAvant++];
          }
          else if(enAvant==STN2){
             charger1();
             enAvant=0;
             c=tampon[enAvant++];
          }
          else{
             c=tampon[enAvant];
             //fin du fichier atteint
          }
       }
       else
          c=tampon[enAvant++];
    }
     
    void reculer(){
       if(enAvant==0)
          if(ftell(source)>=STN1){
             fseek(source,-STN1-derniers,SEEK_CUR);
             derniers=0;
             charger2();
             fseek(source,-STN1,SEEK_CUR);
             enAvant=STN2-1;
          }
          else{
             //début du fichier atteint
             enAvant=1;
          }
       else if(enAvant==STN1+1){
          fseek(source,-STN1-derniers,SEEK_CUR);
          derniers=0;
          charger1();
          fseek(source,-STN1,SEEK_CUR);
          enAvant--;
       }
       enAvant--;
    }
     
    void charger1(){
       derniers=fread(tampon,1,STN1,source);
       tampon[derniers]=EOF;
       if(derniers==STN1)
          derniers=0;
    }
     
    void charger2(){
       derniers=fread(tampon+STN1+1,1,STN1,source);
       tampon[derniers+STN1+1]=EOF;
       if(derniers==STN1)
          derniers=0;
    }

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

Discussions similaires

  1. problème double login
    Par taka10 dans le forum Langage
    Réponses: 4
    Dernier message: 28/03/2007, 11h39
  2. Problème avec tampon
    Par wolfazer dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/09/2006, 11h24
  3. [C#] problème double click
    Par Gloups dans le forum Windows Forms
    Réponses: 4
    Dernier message: 08/09/2006, 07h31
  4. [Débutante] Double tampon
    Par Tootsi dans le forum Graphisme
    Réponses: 6
    Dernier message: 21/02/2006, 20h37
  5. [MySQL] Problème double insertion dans BDD
    Par oceane751 dans le forum PHP & Base de données
    Réponses: 34
    Dernier message: 28/12/2005, 00h09

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