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 :

Petit probleme avec un char*


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Points : 21
    Points
    21
    Par défaut Petit probleme avec un char*
    Bonjour,

    Je fais un petit solitaire en Qt, et j'ai voulu gérer un systeme de meilleurs scores (avec sauvegarde dans fichier texte). Ca marchait tres bien jusqu'a cette apres midi ou j'ai eu des problemes de copie lord de la récuperation des données, puis un probleme... carrément bizarre


    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
     
        char* pseudoAll[10];
    ifstream f("highscore.txt",  ios::in |ios::binary);
            if (f)
            {
                while(!f.eof() && i<NOMBRE_TOP)
                {
                    char *Buffer = new char[100];
                    f.getline(Buffer, 100);
     
                    cout<<Buffer<<endl;
                    char *tmp = new char[strlen(Buffer)];
                    for(int i=0; i<strlen(Buffer); i++)
                        tmp[i] = Buffer[i];
                    tmp[strlen(Buffer)] = '\0';
                    f.getline(Buffer, 100);//entete
                    int h = atoi(Buffer);
                    pseudoAll[i] = new char[strlen(tmp)];
                    if(true)
                    {
                        b=true;
                        for(int j=0; j<strlen(tmp); j++)
                            pseudoAll[i][j] = tmp[j];
                        pseudoAll[i][strlen(tmp)] = '\0';
                        scoreAll[i] = h;
                        i++;
                    }
                  }
            }
            cout<<"en bas :="<<pseudoAll[0]<<endl;
            for(int k=0; k<i; k++)
                cout<<pseudoAll[0]<<"<=>"<<scoreAll[0]<<endl;

    Le probleme est le suivant :

    _cout<<"en bas :="<<pseudoAll[0]<<endl; m'affiche le pseudo correctement
    _for(int k=0; k<i; k++)
    cout<<pseudoAll[0]<<"<=>"<<scoreAll[0]<<endl;[/CODE]
    m'affiche quelque chose du genre :<=>25000

    J'ai rien entre... je comprend pas pouquoi ca fait ca ....J'espere que quelqu'un pourra m'aider.

    Cordialement

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

    Informations professionnelles :
    Activité : aucun

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

    Pourquoi ne passe tu pas directement par une variable std::string plutôt que pas un char* [voir plus loin]

    Ensuite, il faut éviter les boucles du genre de while(!file.eof()) parce que eof() indique... que la dernière lecture a atteint la fin de fichier.

    En outre, on peut se poser la question de savoir pour quelle raison lire "tout le fichier" alors que l'on sait pertinemment qu'il n'y aura jamais que maximum... 10 noms à lire intéressants

    Rajoute à cela le fait qu'il est toujours difficile de commencer à gérer des char** (je pense à la variable pseudoAll), ce qui fait qu'il est sans doute finalement beaucoup plus simple de gérer un std::vector<std::string>, qu'il serait, finalement, préférable de travailler avec un tableau unique de structure dans laquelle le nom et le score seraient regroupés, et qu'enfin, je ne vois pas vraiment l'intérêt de manipuler un fichier binaire là où un fichier texte ferait si bien l'affaire.

    Retiens toujours que la solution la plus simple est la moins compliquée... heu, pardon, la solution la meilleure

    Dés lors, à moins que les spécifications ne précisent explicitement que les scores doivent être enregistrés dans un fichier "binaire", pourquoi aller chercher la difficulté à essayer de le faire ainsi
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    En vrac :

    - n'utilise pas des char* alloués dynamiquement, fais du C++, utilise des std::string et des std::vector
    - utilise std::getline(f, str) et non f.getline pour pouvoir utiliser une string
    - ne teste pas f.eof(), mais f.good(), puis f.eof() pour savoir si la lecture s'est bien passée

    Sinon, je suis étonné que le programme ne plante, il y a plusieurs débordements notamment. Et tu ne peux pas libérer la mémoire correctement.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    J'avais commencer par des string, mais j'avais des problemes de fin de caractere... alors j'ai utilisé des char* et j'ai commencé a m'embrouiller... Je vais essayer d'utiliser tout ce que vous m'avez conseiller de faire tous les deux !!

    Par contre :
    En outre, on peut se poser la question de savoir pour quelle raison lire "tout le fichier" alors que l'on sait pertinemment qu'il n'y aura jamais que maximum... 10 noms à lire intéressants
    Lors de la réecriture, je n'ecrit pas plus de 10 scores ^^

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Nebulis Voir le message
    Lors de la réecriture, je n'ecrit pas plus de 10 scores ^^
    Je m'en doute...

    C'est bien pour cela que je dis qu'il est sans doute préférable de faire une "simple" boucle for(int i=0;i<10;++i) plutôt que de boucler jusqu'à ce que la fin de fichier soit atteinte
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Voila, je viens de refaire entierement mes meilleurs scores, et ca marhce niquel ... j'aurais pas du me prendre la tete avec le fichier binaire et les char**....


    Je vous remercie grandement

    Coridlament

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/11/2009, 23h35
  2. [C#] Petit problème avec un élément du FAQ
    Par matech dans le forum ASP.NET
    Réponses: 11
    Dernier message: 24/01/2008, 14h11
  3. petit probleme avec Devil
    Par ellipse dans le forum DevIL
    Réponses: 2
    Dernier message: 01/02/2005, 18h41
  4. [TP]petit probleme avec solution
    Par pompompolom dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 02/12/2004, 19h48
  5. petit probleme avec l'éditeur de builder
    Par qZheneton dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/10/2004, 16h19

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