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 :

string de longueur fixe


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 18
    Points : 15
    Points
    15
    Par défaut string de longueur fixe
    bonjour,

    je voulais savoir s'il est possible de créer des chaines de caractere, donc des string, de longueur fixe en C++ ??
    afin par exemple si cette variable string fait partie d'une structure, de connaitre exactement la taille de cette structure, sans influence de la saisie de l'utilisateur.


    merci d'avance, vos reponses me feront certainement gagner du temps.

  2. #2
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Ben tu peux créer des tableaux de char avec taille fixe. Sinon pour les string ben, ça pèse un objet string non ? :nerd:

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

    Informations professionnelles :
    Activité : aucun

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

    Sauf erreur de ma part, le propre d'une std::string est, justement, de pouvoir s'allonger au fur et à mesure...

    Toujours sauf erreur de ma part, tu peux cependant demander aux std::string de prendre une taille minimale.

    Et d'un autre coté, tu peux aussi jouer avec std::string.substr(pos_depart, pos_arrivee) pour ne prendre que les caractères qui se trouvent entre pos_depart et pos_arrivee...

    On pourrait donc résumer les choses en: sauf erreur, il n'est pas possible de limiter la taille d'une chaine, mais tu peux créer un comportement qui aura le meme effet

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    J'ai un doute sur l'intérêt de ce que tu cherches à faire.
    Cela me fait penser à du code Pascal sur les fichiers typés que l'on chercherait à adapter en C++.

  5. #5
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Rychi si tu nous exposes le problème, au lieu de chercher une pseudo-solution, on serait peut être plus efficace pour t'aider.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    voila mon veritable probleme :


    je veux creer des structures contenant notament des "string"
    puis, enregistrer ces structures dans un fichier.
    jusque la, pas de souci

    le probleme vien lorsce que je veux lire ce fichier, je devrai connaitre la taille de la structure, or ci celle ci varient en fonction de ce que l'utilisateur met dedans .......... c pas le top!

    donc c pour ca que je cherche a definir en string de longueur fixe

  7. #7
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Tu peux pas mettre, dans un entier par exemple, la taille de ton std::string avant d'enregistrer ?

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Et je suppose que tu veux enregistrer tes structures avec write directement. Ce qui est une mauvaise idée comme on s'en rend compte le jour où, les options de compilation ayant changés, l'organisation mémoire des structures a changés également (sans parler de ce que peut faire un autre compilateur pour un autre OS sur une autre architecture ou des problèmes qui se posent quand on veut changer la structure).

    La bonne technique, qui demande peut-être un peu plus de boulot, c'est de penser à une organisation de fichier (pour ça XML est à la mode ces temps-ci et malgré ses problèmes il a l'avantage d'éviter un certain nombre de problèmes classiques qu'ont ceux qui n'ont jamais pensé à cela sérieusement) et après d'écrire en respectant ce format.

    Pour mettre des chaînes de longueur non définie par avance dans un fichier: se servir d'un marqueur de fin interdit (\0, TAB, CR-LF, FS, virgule,...), se servir d'un marqueur de fin avec un mécanisme d'échappement pour permettre de le mettre dans les données, commencer par la taille des données sont trois techniques possibles.

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    je ne sais pas si c'est propre, mais je commencerais par initialiser un tableau de char de la taille qui va bien, puis j'enquillerais dedans a la suite une taille codée sur 2 bits, la string de la taile correspondante, et ainsi de suite..

    ensuite tu ecris cette chaine dans ton fichier. pour la lecture, tu lis 2 bits, ca te donne un entier n, tu lis n bits, zou tu stocke dans la string, et tu continu. accessoirement, tu mets ou tu veux les elements de taille fixe ! effectivement, cela t'evitera pas mal de probleme par la suite.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    si ton idée c'est de faire un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    struct mastructure
    {
      ...
      std::string chaine;
      ...
    };
     
    void MaFonction(void)
    {
      mastructure mas;
      ...
      fwrite (&mas, sizeof(mastructure), 1, out);
      ...
    }
    sache que ... ce n'est pas possible !

    tu obtiendras dans le meilleur des cas une sauvegarde de pointeurs qui ne te seront d'aucune utilité au moment de recharger les données.

    rappelons qu'en C++, structures et classes c'est à peu près la même chose et que pour sérialiser un objet, il faut généralement implémenter ... une méthode de sérialisation !

    et en utilisant de préférence les flux C++.

  11. #11
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Tu peux utiliser boost pour cela.

    boost.serialization

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Tu utilises quoi pour faire tes lectures ?
    Mets une info par ligne, et lis avec std::getline (!= std::istream::getline)

Discussions similaires

  1. Réponses: 12
    Dernier message: 25/03/2008, 09h15
  2. [String]longueur fixe de chaines
    Par mezoo dans le forum Langage
    Réponses: 5
    Dernier message: 14/12/2006, 10h42
  3. Réponses: 9
    Dernier message: 13/10/2006, 15h39
  4. Déclarer un tableau de longueur fixe
    Par horneth dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 18/08/2006, 22h26
  5. Comment enregistrer un stream de longueur fixe ?
    Par Alcarbone dans le forum MFC
    Réponses: 5
    Dernier message: 13/04/2003, 20h14

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