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 :

Manipulation de caract�res NULL


Sujet :

C++

  1. #1
    Membre confirm�
    Inscrit en
    Avril 2004
    Messages
    83
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par d�faut Manipulation de caract�res NULL
    Bonjour,

    Je poste aujourd'hui pour recevoir quelques conseils : je suis amen� � manipuler des chaines de caract�res en provenance d'un fichier. N�anmoins, ce n'est pas une manipulation anodine puisque les chaines manipul�es peuvent contenir des caract�res NUL (\0) sans que cela ne signifie une fin de fichier.

    Bref, j'ai du mal � manipuler ce contenu.

    je fais l'ouverture et la lecture du fichier avec :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    int fh = _open( path.c_str(), _O_BINARY | _O_RDONLY );;
    int bytesread = _read( fh, buffer, 200); //je lis 200 char par 200 char et stoque dans char buffer[200];
    L'ouverture et la lecture fonctionnent bien, par contre, c'est pour l'affichage, la transformation en string de la chaine ou pour toute autre manip que ca bug � cause des \0.

    Si quelqu'un a un "truc" pour manipuler aisement ce genre de chaine, cela m'aiderai bien !

    Merci

  2. #2
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Si tu utilisais std::string pour manipuler tes cha�nes (et en option, std::ifstream pour tes fichiers), tu n'aurais aucun probl�me.

    Tu peux commencer par jeter un oeil � la FAQ par exemple.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 155
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 155
    Par d�faut
    Question:
    1) Pourquoi ne pas utiliser les fstreams?
    2) Tu es oblig� de travailler en binaire? Tes chaines de caract�res ne peuvent pas etre ouvertes en mode texte?

    3) Si tu dois quand m�me faire du binaire, alors:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    std::ifstream file(path.c_str(), std::ios_base::binary);
    file.read(reinterpret_cast<char*>(&buffer[0], 200* sizeof(char) );

  4. #4
    Membre confirm�
    Inscrit en
    Avril 2004
    Messages
    83
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par d�faut
    Le binaire n'est pas obligatoire mais je trouvais son utilisation plus logique pour ne pas traiter le "\0" comme un char null mais comme une suite de valeur non interpr�t�e.

    Je vais me pencher vers le ifstream mais je voulais savoir si c'�tait possible avec des char et des op�rateur classique comme open et read.

  5. #5
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Dans un tableau de caract�res, le '\0' n'a une signification particuli�re que lorsque tu manipules ton tableau en tant que cha�ne (affichage, calcul de taille, ...). Donc il faudrait commencer par voir ce que tu veux faire de ton tableau de caract�res, pour trouver une solution ad�quate.

    Mais bon, tu devrais quand m�me essayer d'oublier les char[], _open et compagnie si tu veux faire du C++ correct

  6. #6
    Membre confirm�
    Inscrit en
    Avril 2004
    Messages
    83
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par d�faut
    Merci
    Je ne vous demande pas de tout faire � ma place et vous remercie deja de l'aide que vous m'apportez, mais j'ai une autre question.
    J'utilisais _read parce que cela me permettait de stocker des morceaux de fichier et de faire des test dessus de la facon suivante :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    while( ((bytesread = _read( fh, buffer, 200) ) > 0) )
    {
     //Test sur certains des 1600 bits du buffer.
    }
    Ainsi, d�s que j'arrivais en fin de fichier je quittais la boucle.
    Avec le file.read(reinterpret_cast<char*>(&buffer[0]), 200* sizeof(char) ); , est-il possible de faire de m�me (cad quitter en fin de fichier) car file.read ne renvoie pas la taille du contenu.

    De plus, dans la FAC, j'ai not� la facon pour stoquer tout le contenu du fichier dans un string buffer. Comment puis-je stoquer morceau par morceau de 200chars le contenu du fichier dans le string et effectu� des tests dessus de la m�me facon que expliquer pr�cedemment?

    Merci

    edit 11h22: Le soucis avec le stockage total dans un buffer est que je manipule des fichiers de plusieurs centaines de MO, alors tout stocker d'un coup risque de ralentir serieusement ma machine.

  7. #7
    Membre confirm�
    Inscrit en
    Avril 2004
    Messages
    83
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par d�faut
    Citation Envoy� par Laurent Gomila
    Dans un tableau de caract�res, le '\0' n'a une signification particuli�re que lorsque tu manipules ton tableau en tant que cha�ne (affichage, calcul de taille, ...). Donc il faudrait commencer par voir ce que tu veux faire de ton tableau de caract�res, pour trouver une solution ad�quate.

    Mais bon, tu devrais quand m�me essayer d'oublier les char[], _open et compagnie si tu veux faire du C++ correct
    Pour r�pondre a ta question Laurent, je dois faire des tests sur certains bits des caract�res 8bits de mon tableau de caract�res, par exemple sur buffer[1] et buffer[2].

  8. #8
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Citation Envoy� par Chop_chop
    Pour r�pondre a ta question Laurent, je dois faire des tests sur certains bits des caract�res 8bits de mon tableau de caract�res, par exemple sur buffer[1] et buffer[2].
    Et � quel moment le \0 pose probl�me alors ?

  9. #9
    Membre confirm�
    Inscrit en
    Avril 2004
    Messages
    83
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par d�faut
    Citation Envoy� par Laurent Gomila
    Dans un tableau de caract�res, le '\0' n'a une signification particuli�re que lorsque tu manipules ton tableau en tant que chaine (affichage, calcul de taille, ...).
    Citation Envoy� par Laurent Gomila
    Et � quel moment le \0 pose probl�me alors ?
    En quelques sorte, tu as r�pondu � ma question... En fait, je passe mon char buffer [200] en argument dans une fonction donc je re�ois un char* (si je ne me trompe pas) et quand je faisais des manipulations dessus, j'obtenais des valeurs erron�es. Par exemple, j'avais en l'occurrence un char NULL au 70eme char alors j'obtenais une size de 70... et je croyais donc que le contenu avait mal �t� transmis...

    D�sol� du d�rangement.

  10. #10
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    ( j'insiste, passe aux std::string et � la gestion des flux avec les outils de la biblioth�que standard, les choses sont rendues si faciles avec! Tu peux lire par paquet de X caract�res, les tester, puis les mettre dans un tableau, ... Regarde la FAQ vraiment )

  11. #11
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    En m�me temps, ici ce serait plut�t un std::vector<char>, puisque justement il ne veut pas traiter son tableau de chars comme une cha�ne.

  12. #12
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    Ah oui, apr�s relecture en effet je vois que �a serait plus adapt�.
    En C++ standard, il est tr�s facile avec la notion d'it�rateur de remplir ais�ment des conteneurs.

    Dans tous les cas, les outils fournis dans la biblioth�que standard sont assez rapide pour la plupart et s'adaptent facilement aux traitements que l'on souhaite faire.
    Dans ton cas, il est facile de remplir ton conteneur par paquets de X caract�res par exemple, ou alors jusqu'� rencontrer tel ou tel caract�re, ...
    Pour cela, regarde la section "flux standards" dans la FAQ.

Discussions similaires

  1. Suppresion d'un caract�re NULL en d�but de chaine
    Par GingGing dans le forum Delphi
    R�ponses: 5
    Dernier message: 10/08/2006, 09h06
  2. [VB]manipulation des caract�res d'un string
    Par lacsap49 dans le forum VB.NET
    R�ponses: 5
    Dernier message: 16/06/2006, 18h43
  3. Identification d'une chaine de caract�re null
    Par jacques70 dans le forum Langage
    R�ponses: 9
    Dernier message: 11/05/2006, 17h14
  4. R�ponses: 3
    Dernier message: 14/03/2006, 14h43
  5. Aide sur une fonction / pbm de manipulation de caract�re
    Par captainamerica75 dans le forum Access
    R�ponses: 3
    Dernier message: 16/02/2006, 11h54

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