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