Problème getline pour la lecture d'un fichier C++

Résolu
janiaut
Messages postés
8
Date d'inscription
jeudi 13 mars 2003
Statut
Membre
Dernière intervention
30 août 2006
- 22 août 2006 à 09:12
janiaut
Messages postés
8
Date d'inscription
jeudi 13 mars 2003
Statut
Membre
Dernière intervention
30 août 2006
- 23 août 2006 à 09:46
Bonjour, je suis novice dans la programmation en C/C++ et j'ai quelques problèmes sur la lecture d'un fichier. Je vous explique ce qu'on me programme doit faire :
Mon but est de lire un fichier "fichier.txt" contenant des chaines de caractères à verifier. Dans un premier temps le fichier contient

nondata
nondata
0
0

J'utilise la fonction getline mais lorsque je compare la valeur à "nondata", le test me retourne faux. Et je n'arrive pas a comprendre pourquoi, pouvez vous m'aider. Merci bcp voici le code

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <fstream>
#include <string>
#include




using namespace std;

 *************************************************************************************************
// MAIN
// ------------------------------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])

    char* chain;
    char* last = "00";
    char* valeur = "00";;
    char* current;
    char* next;


    std::ifstream fichier( "fichier.txt" );
    std::string ligne; // variable contenant chaque ligne lue
    if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
    {
       // cette boucle s'arrête dès qu'une erreur de lecture survient
        if ( std::getline( fichier, ligne ) )
        {
            // créer le buffer pour copier la chaîne
            size_t size = ligne.size() + 1;
            char * buffer = new char[ size ];
            // copier la chaîne
            strncpy( buffer, ligne.c_str(), size );   //conversion strinf en char*
            // utiliser le buffer
            current = buffer;
        }
    }
    while(std::getline( fichier, ligne ))
    {
        // créer le buffer pour copier la chaîne
        size_t size = ligne.size() + 1;
        char * buffer = new char[ size ];
        // copier la chaîne
        strncpy( buffer, ligne.c_str(), size);
        // utiliser le buffer
        next = buffer;
        if(current == NULL) 
           current = "silence";
        if(next == NULL) 
           next = "silence";
        if(current == "silence")
        {
            if((last=="01")&&(last=="10"))
            {
                printf("erreur dans le fichier valeur non reconnue);
            }
            else
            {
                if(last=="00") valeur="00";
                else valeur = "11";
            }
        }
        else if(current == "nondata")           //problème du test !!!!!!!!!! HELP ME
        {                                                    // ne vas pas dans la boucle
         if(last=="00")
         {
             valeur="01";
         }
         else 
         if (last=="11") 
         {
             valeur="10";
         }  
         else if (last=="01")
         {
             if((next=="nondata")||(next=="zero")) valeur="10";
             else if((next=="one")||(next=="silence"))valeur="11";
             else printf("erreur dans le fichier valeur non reconnu");
         }
         else if (last=="10")
         {
             if((next=="nondata")||(next=="zero")) valeur="01";
             else if((next=="one")||(next=="silence"))valeur="00";
             else printf("erreur dans le fichier valeur non reconnu");
         }
         else printf("erreur dans le fichier valeur non reconnu");
     }
     else if(current == "one")
     {
         if (last=="00")
         {
             if((next=="nondata")||(next=="zero")) valeur="10";
             else if((next=="one")||(next=="silence"))valeur="11";
             else printf("erreur dans le fichier valeur non reconnu");
         }
         else if (last=="11")
         {
             if((next=="nondata")||(next=="zero")) valeur="01";
             else if((next=="one")||(next=="silence"))valeur="00";
             else printf("erreur dans le fichier valeur non reconnu");
         }
         else printf("erreur dans le fichier valeur non reconnu"); 
     }
     else if(current == "zero")
     {
         if (last=="01")
         {
             if((next=="nondata")||(next=="zero")) valeur="01";
             else if((next=="one")||(next=="silence"))valeur="00";
             else printf("erreur dans le fichier valeur non reconnu");
         }
         else if (last=="10")
         {
             if((next=="nondata")||(next=="zero")) valeur="10";
             else if((next=="one")||(next=="silence"))valeur="11";
             else printf("erreur dans le fichier valeur non reconnu");
         }
         else printf("erreur dans le fichier valeur non reconnu"); 
      }
      else
      printf("erreur dans le fichier valeur non reconnu");
      printf("%s",valeur);
      last = valeur;
     current = chain; 
    }
}

//------------------------------ MERCI BEAUCOUP   ----------------------------------

5 réponses

luhtor
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
6
22 août 2006 à 10:13
Faut utiliser strncmp pour comparer deux chaines:

if (strncmp(current, "silence", 7) == 0)

    {

    }


Au passage, ca, c'est archi faux:

if(next == NULL) 

    next = "silence";


Mais pk tu mélanges string et char* ? utilise que des string...
3
janiaut
Messages postés
8
Date d'inscription
jeudi 13 mars 2003
Statut
Membre
Dernière intervention
30 août 2006

23 août 2006 à 09:46
Merci a tous vous m'avez bien aiguillé, en fait j'ai tout passé en string et effectué les test de la manière suivante :


string var;


if(var= =(string)"nondata") ....


encore merci   luhtor et =304809 turnerom  
3
janiaut
Messages postés
8
Date d'inscription
jeudi 13 mars 2003
Statut
Membre
Dernière intervention
30 août 2006

22 août 2006 à 10:26
Je te remercie, je vais essayer cela ce soir car la j'ai pas de quoi développer.


Oui je sais que je mélange mais comme je suis novice, j'ai pris des bout de programme à droite à gauche. et certain avec des char* (calcul de CRC). Est-ce compliquer de tout changer, y'a-t-il une méthode simple pour rendre mon code "beau" et uniforme.


Merci
0
turnerom
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
22 août 2006 à 11:06
La méthode de luhtor est la bonne pour ton problème sauf si utilise des
string partout, dans ce cas == marche, ce que je te conseil .


Par contre pour rendre ton code uniforme et beau, tu peux le décomposer
et ne pas tout mettre dans le main. Fait une fonction pour chaque test
qui renvoi true ou false par exemple en fonction du resultat plus ton
parametre valeur passé par référence a chaque fonction pour pouvoir
être modifié!

TuRn3r
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
janiaut
Messages postés
8
Date d'inscription
jeudi 13 mars 2003
Statut
Membre
Dernière intervention
30 août 2006

22 août 2006 à 13:33
Merci beaucoup a tous, avec vos info cela devrait marché.
0