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 pour récupérer des valeurs dans fichier


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 80
    Points : 48
    Points
    48
    Par défaut Problème pour récupérer des valeurs dans fichier
    Salut à tous ,

    Malgré l'aide de la FAQ je bloque encore ... Je suis un peu un débutant avec les classes ofstream , ifstream ...
    Mon tp est sur les surfaces de Bézier . A un moment je dois lire dans un fichier qui se présente comme suit :

    4 4
    500 1000 2000
    1000 750 1500
    ...
    ...

    La 1ère ligne indique le N° de lignes puis de colonnes de notre surface puis suivent les coordonnées de nos points constituant la surface.
    Il faut donc que je récupère toutes ces données puis que je les stocke .

    Le problème est que je récupère 52 et 32 pour le nombre de lignes et colonnes(valeurs ASCII ? si oui possibilité de faire la conversion ascii -> int) . Je ne me suis pas encore attardé pour les coordonnées . Voici mon bout de code :

    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
     
    if (fich) //Si le fichier est ouvert 
        {
            string ligne; // Notre variable qui contiendra chaque ligne lue
     
     
    		int numLigne = 0 ; //Variable indiquant le n° de la ligne en lecture
     
    		// cette boucle s'arrête dès qu'une erreur de lecture survient
            while (getline( fich, ligne ) ) {
     
                //Récuperation des données contenues dans le fichier 
     
    			string recup = ligne ;
    			SIZE_T size = recup.size() + 1 ; 
    			char *premiereLg = new char[size] ; 
     
    			if (numLigne == 0){
    				strncpy(premiereLg,recup.c_str(),size);
    				nblignes = (int)premiereLg[0];
    				nbcols = (int)premiereLg[1];
    			}
     
    			//else {} Récupérer les coordonnées des points 3D 
            }
        }
    Il n'est pas entièrement terminé et il doit y avoir des trucs inutiles mais je voulais vous demander un peu d'aide avant de continuer.
    Voici de plus près ce que je vois en mode debug :


    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Si tu *sais* pertinemment que ton fichier sera "bien rempli" (AKA que tu auras d'office nbligne, nbcolone suivi de nbligne*nbcolone information), tu n'est nullement obligé de passer par un lecture ligne par ligne...

    Tu peux passer directement par un code qui prend la forme de
    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
     
    std::ifstream ifs(filename.c_str());
    std::vector<letype_adhoc> tab;
    if(!ifs)
    {
        /* fichier pas ouvert */
     
    }
    else
    {
        size_t maxlines;
        size_t maxcols;
        if(!(ifs>>maxlines>>maxcols))
        {
            /* pas su lire ligne et / ou colones */
        }
        else
        {
            for(size_t i=0;i<maxlines;i++)
            {
                for(size_t j=0;j<maxcol;j++)
                {
                     letype_adoc lu;
                     if(! (ifs>>lu)
                     {
                         /* pas su lire l'élément */
                     }
                     else
                     {
                         tab.push_back(lu);
                     }
                }
            }
        }
        /* éventuellement gérer tab ou */
    }
    return tab;
    Tous les "pas su" devraient sans doute sortir sur erreur ou lancer une exception

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 80
    Points : 48
    Points
    48
    Par défaut
    Merci pour ta réponse , mais il y a beaucoup trop de choses que je comprends pas ton programme (type vector , etc...) ,puis je veux pas faire un ctrl+C , ctrl+V sinon je suis un peu cuit ... Je suis entêté mais j'aimerais lire quand même ligne par ligne et connaître s'il y a une conversion possible ASCII -> int ?
    Puis en continuant mon mode debug , pour récupérer la 1ère coordonnée par exemple , je récupérais que le '5' de '500' alors que je voudrais 500 ...

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    En fait, l'astuce, c'est que tu veux essayer de convertir "caractère par caractère" la valeur alors que, pour les types "primitifs" (entiers, réels...) tu peux, tout simplement, en demander la lecture "telle quelle"

    Ici, j'ai choisi de placer les valeurs dans un tableau, mais tu peux en faire tout ce que tu veux

    Si tu ouvre un fichier en lecture que tu nomme (par exemple) ifs, il te suffit, si tu sais que tu vas lire des types primitifs, de déclarer variables du type à utiliser (int pour un entier, float ou double pour un réel (selon les besoins, ...) à lire et de les récupérer "directement" grace à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifs>>valeur1>>valeur2>>valeur3/* >>...*/

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 80
    Points : 48
    Points
    48
    Par défaut
    Thanks ! J'y suis presque mais chose étonnante , apparamment il ne me lit pas la 1ère ligne : Les valeurs de nblignes et nbcolonnes sont : 500 et 1000

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (fich){
    		 string ligne ;
    		 int count = 0 ; 
    		// cette boucle s'arrête dès qu'une erreur de lecture survient
    		while ( getline(fich,ligne)) {
     
    			fich >> nblignes >> nbcols ; 
    			count++ ; 
     
    		}
    	}
    Peut-être la variable ligne qui ne sert à rien !?
    Mon fichier est bien structuré et comporte 17 lignes . A la fin de la boucle , count vaut bien 17 , ce qui m'étonne encore plus !

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 80
    Points : 48
    Points
    48
    Par défaut
    J'ai mis :

    While ( ! fich.eof() )
    et cela marche . Bizarre quand même que pour la version précédente il ne lisait pas la 1ère ligne .

    MErci beaucoup pour ton aide

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par kev42100 Voir le message
    Thanks ! J'y suis presque mais chose étonnante , apparamment il ne me lit pas la 1ère ligne : Les valeurs de nblignes et nbcolonnes sont : 500 et 1000

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (fich){
    		 string ligne ;
    		 int count = 0 ; 
    		// cette boucle s'arrête dès qu'une erreur de lecture survient
    		while ( getline(fich,ligne)) {
     
    			fich >> nblignes >> nbcols ; 
    			count++ ; 
     
    		}
    	}
    Peut-être la variable ligne qui ne sert à rien !?
    Mon fichier est bien structuré et comporte 17 lignes . A la fin de la boucle , count vaut bien 17 , ce qui m'étonne encore plus !
    C'est normal :

    Tu commences par ouvrir ton flux de fichier (curseur au debut du flux).
    Puis tu fais un getline (premiere ligne du fichier qui passe dans la chaine ligne et curseur positionné à la ligne suivante).
    Enfin tu commences à lire nblignes et nbcolonnes mais le flux n'est plus au début, ces infos sont dans ligne...

    Essayes plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    file( "chemin.txt" );
    if ( !file )
      return;
     
    file >> nblignes >> nbcolonnes;
    while ( std::getline( file, line ) ) // line ne contiendra maintenant à priori que le retour charriot
    {
      file >> p.x >> p.y >> p.z;
      ++p;
    }

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/01/2013, 16h39
  2. Réponses: 13
    Dernier message: 09/11/2011, 12h06
  3. Problème pour définir une valeur dans la base des registres
    Par hellspawn_ludo dans le forum Dreamshield
    Réponses: 2
    Dernier message: 30/09/2007, 03h03
  4. Récupérer des valeurs dans des fichiers html
    Par nico93100 dans le forum Langage
    Réponses: 1
    Dernier message: 05/01/2006, 21h46
  5. problème pour récupérer une valeur dans ma bd (débutante)
    Par auryn111 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/08/2005, 17h49

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