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

SL & STL C++ Discussion :

Impossible de lire le bon nombre de caractère dans un fichier binaire


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Points : 16
    Points
    16
    Par défaut Impossible de lire le bon nombre de caractère dans un fichier binaire
    Bonsoir tout le monde, j'ai un problème avec la méthode read. Le code parlera mieux que moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int longueurMot;
    char* buffer;
    nomFichier.read((char *)&longueurMot,sizeof(longueurMot));
     
    buffer = new char [longueurMot];
    nomFichier.read(buffer,longueurMot);
    string valeurMot = buffer;
    delete[] buffer;
    Malgré le fait que je spécifie la taille du buffer à longueurMot, lorsque j'affiche la valeur de buffer, il me retourne par exemple test°8= alors que mon mot est test, et que la longueur est bien de 4. Je ne vois pas ce qui peut provoquer cette erreur. Merci pour votre aide

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Peut être un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer[longueurMot] = 0;

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Cela ne fonctionne pas, j'ai toujours le même affichage

    J'ai toujours la possibilité de remplacer les caractères > longueur par des chaînes vides, mais c'est très moche comme méthode! C'est tout de même bizarre qu'il me place ces caractères dans la chaîne.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Le problème n'est pas la lecture du buffer, mais la création de la chaîne à partir de celui-ci. Le constructeur de std::string prenant en paramètre un char* uniquement suppose que ce char* est une chaîne à la mode C, c'est à dire délimitée par un 0 terminal. Donc, deux possibilités :
    - Tu alloues ton buffer pour un caractères de plus, que tu mets à 0.
    - Tu utilises un autre constructeur de std::string, prenant en paramètre supplémentaire le nombre de caractères à lire du buffer.

    La seconde méthode est préférable si ta chaîne peut contenir un 0 intermédiaire.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Peut être un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer[longueurMot] = 0;
    Donc, tu affecte une valeur à un élément situé en dehors du tableau...

  6. #6
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Donc, tu affecte une valeur à un élément situé en dehors du tableau...
    oops

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Le problème n'est pas la lecture du buffer, mais la création de la chaîne à partir de celui-ci. Le constructeur de std::string prenant en paramètre un char* uniquement suppose que ce char* est une chaîne à la mode C, c'est à dire délimitée par un 0 terminal. Donc, deux possibilités :
    - Tu alloues ton buffer pour un caractères de plus, que tu mets à 0.
    - Tu utilises un autre constructeur de std::string, prenant en paramètre supplémentaire le nombre de caractères à lire du buffer.

    La seconde méthode est préférable si ta chaîne peut contenir un 0 intermédiaire.
    Le problème c'est que l'erreur est déjà présente avant que je construise le string, un cout << buffer me retourne le même résultat.

    Tiens, un buffer[longueurMot]=0 résoud le problème, mais tu viens de dire que ça écrivait à l'extérieur du tableau dc je vois pas comment avoir un résultat juste avec un code propre.

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 951
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 951
    Points : 5 671
    Points
    5 671
    Par défaut
    Fio,
    Citation Envoyé par Knuckles Voir le message
    Le problème c'est que l'erreur est déjà présente avant que je construise le string, un cout << buffer me retourne le même résultat.

    Tiens, un buffer[longueurMot]=0 résoud le problème, mais tu viens de dire que ça écrivait à l'extérieur du tableau dc je vois pas comment avoir un résultat juste avec un code propre.
    Il faut créer un buffer de longueur suffisante, c'est tout.

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par droggo Voir le message
    Fio,

    Il faut créer un buffer de longueur suffisante, c'est tout.
    Mon buffer est pile de la bonne taille. longueurMot est exactement de la taille du mot à lire par la suite, donc le problème ne vient pas de la!

    J'ai résolu le problème en placant 0 à la fin de la chaîne par un mais je trouve ça assez moche. Tant pis! Si quelqu'un a une idée, n'hésitez pas

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Knuckles Voir le message
    Le problème c'est que l'erreur est déjà présente avant que je construise le string, un cout << buffer me retourne le même résultat.
    Normal : l'opérateur << avec un cout et un char* s'attend aussi que le char* soit à la mode C, avec un 0 terminal.

    Citation Envoyé par Knuckles Voir le message
    Tiens, un buffer[longueurMot]=0 résoud le problème, mais tu viens de dire que ça écrivait à l'extérieur du tableau dc je vois pas comment avoir un résultat juste avec un code propre.
    Je me répète :
    - Tu alloues ton buffer pour un caractères de plus, que tu mets à 0.

    Ou tu utilises ma seconde solution.

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Normal : l'opérateur << avec un cout et un char* s'attend aussi que le char* soit à la mode C, avec un 0 terminal.



    Je me répète :
    - Tu alloues ton buffer pour un caractères de plus, que tu mets à 0.

    Ou tu utilises ma seconde solution.
    Merci beaucoup, je vais prendre la seconde solution et chercher ce fameux constructeur. Je te remercie pour ton aide.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/03/2013, 16h58
  2. Réponses: 15
    Dernier message: 26/04/2009, 17h08
  3. nombre de caractères dans un fichier
    Par rico3434 dans le forum Linux
    Réponses: 10
    Dernier message: 20/09/2007, 22h58
  4. [W3C] Nombre de caractère dans les formulaires
    Par oranoutan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/12/2005, 02h37
  5. Connaitre le nombre de caractère ";" dans un champ
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 25/11/2004, 18h36

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