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 avec getline


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut Problème avec getline
    Voila, j'ai quelques problème avec getline.
    Je lit ce fichier :
    [Melia/Lignes=5]
    Pré sentation.
    Sphere of Kseira, qu’est-ce que c’est ?
    C’est un projet RPG 2D iso, débuté le 1 janvier 2006. Un projet assez simple,
    même s'il va nous pendre du temps, beaucoup de temps.
    Pas de date de prévu bien sur, vu que nous sommes tous amateur dans l'équipe.
    [/Melia]
    [Solas/Lignes=3]
    - Et sa parle de quoi le jeu ? & Sur le monde de Martalya vivaient, il y a bien longtemps, les Anciens.
    Ils ont bâtis toute la civilisation humaine, mais aussi ce que l'on nomme a présent "La barrière des Anciens".
    Celui qui essaye de la traverser se fait immédiatement soustraire le Kseira de son corps.
    [/solas]
    [/END]
    Et que je lance ce prog :
    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
     
    #include <iostream>
     
    #include <string>
    #include <fstream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
     
        string buffer;
        int pos1 = 0, pos2 = 0;
        ifstream f("dialogues.dlog");
        string avatar;
     
     
        f >> buffer;
     
        avatar = buffer.substr(buffer.find("[")+1, buffer.find("/")-1);
     
        cout <<endl << avatar << " dit : " << buffer << endl;
        while (buffer != "[/" + avatar + "]")
        {
     
            getline(f, buffer);
     
            cout << buffer << endl;
     
            f >> buffer;
        }
     
     
     
        cout <<endl;
        system("PAUSE");
        return 0;
     
    }
    Le programme oublie d'afficher a chaque fois le premier mot de chaque ligne !!!

    Si vous pouviez m'aider

    acieroid

  2. #2
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while (buffer != "[/" + avatar + "]")
        {
     
            getline(f, buffer);
     
            cout << buffer << endl;
     
            //f >> buffer;
        }
    Tu lis une ligne puis tu la met dans buffer.
    Ensuite tu lit le premier mot et tu le met dans buffer, c'est pour ça qu'à la ligne suivante il te manque le premier mot.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    C'est bon, j'ai trouvé, merci, mais j'ai une erreur quand avec les pointeur string

    Voila mon code entier :

    #include <string>
    #include <fstream>
    #include <iostream>
    #include <stdlib.h>
    #include <sstream>

    using namespace std;

    void lire(string *line);

    int main(int argc, char *argv[])
    {


    string * line;
    lire(line);

    cout << line[0] ;


    cout <<endl;
    return 0;

    }


    void lire(string *line)
    {
    string buffer;
    ifstream f("dialogues.dlog");
    string avatar;
    int n_lignes = 0;

    while (getline(f, buffer))
    {
    avatar = buffer.substr(buffer.find("[")+1, buffer.find("/")-1); //On lite l'avatar

    istringstream line_read(buffer.substr(buffer.find("Lignes=")+7, buffer.find("/")-1) ); //On lit le nb de lignes

    line_read >> n_lignes;


    line = new string[n_lignes];

    //cout << avatar << " dit : " << endl;
    for(int i = 0; (getline(f, buffer) && buffer != "[/" + avatar + "]"); i++)
    {
    line[i]= buffer;
    //cout << "\t" <<line[i]<< endl;


    }
    }
    }

  4. #4
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Quand tu as un problème n'hésites pas à donner le(s) message(s) d'erreurs qui va/vont avec.

    Tu a un problème avec les pointeurs, c'est évident. N'hésites pas à réviser un petit cours sur les pointeurs, ça fait toujours du bien au début... et même après


    I. Allocation dynamique -> destruction de l'espace
    - tu as un new ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    line = new string[n_lignes];
    -> tu dois donc avoir forcément un delete quelque part pour libérer la mémoire que tu as alloué dynamiquement.


    II. Passage par pointeur dans une fonction:
    En général quand on veut travailler sur un pointeur dans une fonction et pouvoir le récupérer en dehors de celle-ci, on utilise le retour de la fonction et non un paramètre.
    Et ce n'est pas pour rien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string * line;
    lire(line);
    - tu crée un pointeur vers un string, il n'est pas initialisé, l'adresse vers laquelle il pointe peu être n'importe quoi.
    - tu passes ce pointeur à une fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void lire(string *line)
    - La fonction crée un nouveau pointeur vers string et l'initialise avec le paramètre, c'est à dire dans ce cas n'importe quoi. Cette variable (line) est interne à la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    line = new string[n_lignes];
    - cette fois tu initialises la variable line avec une adresse correcte, car récupérée d'une allocation dynamique de mémoire.


    PROBLEME: la variable line de main n'est pas modifiée. (en effet les deux line sont deux variables différentes qui contiennent une adresse (elles peuvent être vu comme des entiers).


    SOLUTIONS:
    - Tu utilises le retour de la fonction lecture et non un paramètre. (simple)
    - Tu utilises un double pointeur de string pour pouvoir modifier le line du main. (moins simple )

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par MatRem
    SOLUTIONS:
    [...]
    - Tu utilises un double pointeur de string pour pouvoir modifier le line du main. (moins simple )
    je n'ai fait que survoler le sujet mais face aux pointeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector< std::string >
    STL
    pas de new, pas de delete, pas de C

  6. #6
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Sauf que là acieroid ne veux pas un tableau de chaine mais juste une chaine.

    C'est vrai qu'il n'est même pas vraiment nécessaire d'utiliser les pointeurs, on pourrait retourner, directement une chaine, ou bien passer un paramètre par référence...

    Y'a plein de solutions, mais je suis resté sur celle qu'il a commencé, c'est à dire les pointeurs, qu'il est bon de connaitre...

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Oui mais manipuler un pointeur nécessite bcp de précautions. Tu fais bcp de new dans ton programme, mais aucun delete... En plus l'allocation dynamique est plus lente.
    http://c.developpez.com/faq/cpp/?pag...ture_par_ligne

Discussions similaires

  1. Problème avec la fonction Getline
    Par Arman dans le forum C++
    Réponses: 3
    Dernier message: 26/07/2013, 14h48
  2. Problème avec getline(cin, str)
    Par djoe43 dans le forum C++
    Réponses: 12
    Dernier message: 05/05/2010, 17h52
  3. Problème avec cin.getlin dans un for
    Par Carnat89 dans le forum Débuter
    Réponses: 2
    Dernier message: 02/07/2009, 21h09
  4. Problème avec la fonction getline
    Par iamor dans le forum C++
    Réponses: 36
    Dernier message: 11/08/2006, 11h29
  5. Problème avec getline().
    Par bouceka dans le forum C++
    Réponses: 4
    Dernier message: 23/01/2006, 18h23

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