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 :

Convertion pointeur tableau de char EN string


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 28
    Points : 21
    Points
    21
    Par défaut Convertion pointeur tableau de char EN string
    Bonsoir,

    la FAQ n'a pas la réponse à mon problème.
    Il s'agirais de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    // Init. 
    string chaine;
    char* pc = new char[35];
     
    flux.read(pc, 35); // Lecture de 35 octet d'un fichier
    chaine = string(*reinterpret_cast<string*>(pc)); // Conversion pc en string
    Evidement ça ne marche pas... Mais l'idée est là. ça fonctionne pour des int, des double... mais pas pour des string.
    J'ai pu voir sur un site :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chaine = string str(pc);
    Fonctionne ? Merci pour vos réponses !

  2. #2
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonsoir,

    les constructeurs de la classe std::string sont clairs =>click<=

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string (const char* s);
    string (const char* s, size_t n);
    Pour la lecture dans un fichier, n'oublie pas d'utiliser le standard C++ (et pas C), si jamais ce n'est pas déjà ce que tu fais : click (ifstream)

    Et utiliser reinterpret_cast est un dernier recours, que tu devrais utiliser très peu de fois dans ta vie de programmeur, à éviter absolument tant que c'est possible, car dangereux.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Le "const" n'est pas problématique? Car la fonction "read" accept un char* et non un const char*.
    Concernant le "reinterpret_cast" je n'ai pas trouvé d'autre moyen pour traduire des octets en entier, double...

  4. #4
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Non ce n'est pas problématique, cela veut juste dire que le pointeur n'est pas modifiable. Mais il y a moyen de faire de toute façon plus simple, sans manipuler des types primitifs comme le char*

    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
     
    #include <iostream>
    #include <fstream>
    #include <string>
     
    using namespace std;
     
    int main()
    {
        ifstream inputFileStream;
        inputFileStream.open("test.txt");
        string name;
        getline(inputFileStream,name);
        cout << name;
     
        return 0;
    }
    Avec un fichier text.txt, contenant du texte, ceci fonctionne (attention pas testé, mais à mon avis cela manque de tests pour éviter tout plantage).

  5. #5
    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
    Par rapport au code initial, il y a aussi un autre problème, c’est que la chaîne n’est pas nécessairement terminée par un \0, donc il faut bien utiliser le constructeur qui prend un size_t.

    Pour ce qui est du reinterpret_cast, c’est à éviter de manière générale. Convertir un tableau de char[4] en entier nécessite de savoir l’endianness qu’on utilise. Et si on est au sein d’un tableau plus grand (par exemle, à l’index 2 d’un tableau de 8) c’est pire car il y a potentiellement des problèmes d’alignement qui font que le reinterpret_cast va planter sur certaines architectures (et sur les autres, ce sera lent).

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Citation Envoyé par radlabo94 Voir le message
    Le "const" n'est pas problématique? Car la fonction "read" accept un char* et non un const char*.
    Non, au contraire:
    • Il est normal que la fonction read exige un char* et non un const char*, car elle MODIFIE le contenu pointé
    • Une fonction qui prend un paramètre const acceptera parfaitement un paramètre de type non const, car le const signifie simplement qu'elle s'engage (vérifié par le compilateur) à ne pas modifier le contenu du paramètre
    • La seule chose qui poserait problème ce serait de déclarer un const char* et le passer à read. Dans ce cas tu aurais une erreur de compilation, car on ne peut passer une référence constante à une fonction qui souhaite modifier se valeur


    Citation Envoyé par radlabo94 Voir le message
    Concernant le "reinterpret_cast" je n'ai pas trouvé d'autre moyen pour traduire des octets en entier, double...
    Pour ajouter ma couche à la très juste réaction de white_tentacle, tu es à la merci du moindre détail d'implémentation qui peut différer entre le producteur et le consommateur du fichier, parce que le reinterpret_cast ordonne au compilateur "ferme les yeux et considére que les octets à partir de l'adresse pointée sont les données internes, privées, de la variable". Donc sauf si tu es sûr que les octets en question sont un dump brut de l'état interne d'une variable fait par le même runtime, ton code cesse d'être valide à cette ligne. Au mieux tu vas avoir une valeur aberrante dans ta nouvelle variable, mais tu peux même te retrouver à créer deux variables ou plus qui se chevauchent en mémoire avec des effets de bord incompréhensibles...bref...
    On enfonce peut-être des portes ouvertes mais ta façon de remplacer l'appel au constructeur de string par un reinterpret_cast me fait plutôt penser qu tu ne maîtrise pas ces notions...

Discussions similaires

  1. [Débutant] Convertir un tableau de char en string
    Par Ludovic_R_37 dans le forum VB.NET
    Réponses: 2
    Dernier message: 29/08/2013, 17h14
  2. transformer un tableau de char en string puis en float?
    Par maf.mouton dans le forum Débuter
    Réponses: 8
    Dernier message: 30/04/2009, 13h34
  3. Convertion d'un String en tableau de char.
    Par elephant13 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/02/2008, 19h01
  4. tableau de char vers string hexa
    Par andromeda dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 22/07/2007, 23h10
  5. [Debutant]String en tableau de char
    Par amel2006 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 05/03/2006, 10h33

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