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 :

char * buffer = new char [length];


Sujet :

C++

  1. #1
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 393
    Billets dans le blog
    16
    Par défaut char * buffer = new char [length];
    Bonjour,

    que pensez-vous de ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char * buffer = new char [length];
    /code/
    delete[] buffer;
    j'ai trouvé ça dans cette page:https://cplusplus.com/reference/istream/istream/seekg/

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    C'était très bien y'a 40 ans, depuis on a inventé std::vector.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    C'est une utilisation d'un autre temps. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char*  buffer = new char[length];
    double d = std::stod( "hello" ); // => exception et le delete n'est jamais fait!
    delete[] buffer;
    Et bing, tu as une fuite mémoire!

    Il a plein d'autres manières possible par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<char>  buffer(length);
    /*code*/

  4. #4
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 393
    Billets dans le blog
    16
    Par défaut
    comment charger un tampon en vector depuis un fichier? Avec une boucle?

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par matser Voir le message
    comment charger un tampon en vector depuis un fichier? Avec une boucle?
    Un std::vector c'est un buffer comme un autre. Le choix de la manière dépend du besoin.

  6. #6
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 393
    Billets dans le blog
    16
    Par défaut
    merci pour la réponse.

    Si je compile ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <fstream>
    #include <vector>
     
    int main(){
      std::ifstream F("toto");
      int taille=15;
      std::vector<char>tampon(taille);
      F.read(tampon,taille);
      return 0;
    }
    ça donne à la compilation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    main.cpp: In function ‘int main()’:
    main.cpp:8:10: error: cannot convert ‘std::vector<char>’ to ‘std::basic_istream<char>::char_type*’ {aka ‘char*’}
        8 |   F.read(tampon,taille);
          |          ^~~~~~
          |          |
          |          std::vector<char>
    In file included from /usr/include/c++/11/fstream:38,
                     from main.cpp:1:
    /usr/include/c++/11/istream:486:23: note:   initializing argument 1 of ‘std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::read(std::basic_istream<_CharT, _Traits>::char_type*, std::streamsize) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::char_type = char; std::streamsize = long int]486 |       read(char_type* __s, streamsize __n);
          |            ~~~~~~~~~~~^~~
    une idée?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 487
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 487
    Par défaut
    Si tu ne respecte pas les type de données en argument des fonctions, ca ne peut pas compiler.

    La fonction read attend un tableau de caractères en entrée:
    https://en.cppreference.com/w/cpp/io/basic_istream/read

    Tu veux faire quoi exactement ?

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 464
    Par défaut
    Pour un buffer/tampon, moi, je serais plus sur du std::byte que du "char" tout moisi du C.
    https://en.cppreference.com/w/cpp/types/byte

  10. #10
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 393
    Billets dans le blog
    16
    Par défaut
    Merci Boosk, ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <fstream>
    #include <vector>
    #include <iostream>
     
    int main(){
      std::ifstream F("toto");
      int taille=15;
      std::vector<char>tampon(taille);
      char* p=tampon.data();
      F.read(p,taille);
      for(int i=0;i<tampon.size();i++)
        std::cout<<tampon[i]<<' '<<std::endl;
      return 0;
    }

  11. #11
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 393
    Billets dans le blog
    16
    Par défaut
    Pour un buffer/tampon, moi, je serais plus sur du std::byte que du "char" tout moisi du C.
    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
    #include <fstream>
    #include <vector>
    #include <iostream>
    #include  <cstddef>
     
    int main(){
      std::ifstream F("toto");
      int taille=15;
      std::vector<std::byte>tampon(taille);
      std::byte* p=tampon.data();
      F.read(p,taille);
      for(int i=0;i<tampon.size();i++)
        std::cout<<tampon[i]<<' '<<std::endl;
      return 0;
    }
    ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ g++ main.cpp -g
    main.cpp: In function ‘int main()’:
    main.cpp:11:10: error: cannot convert ‘std::byte*’ to ‘std::basic_istream<char>::char_type*’ {aka ‘char*’}
       11 |   F.read(p,taille);
          |          ^
          |          |
          |          std::byte*

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 464
    Par défaut
    Cela montre que l'utilisation de "std::ifstream.read" n'est pas "bien fait pour" et qu'il faut faire méga gaffe à la manière de l'utiliser.

    https://codereview.stackexchange.com...nto-vectorbyte

  13. #13
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 393
    Billets dans le blog
    16
    Par défaut
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <iostream>
    #include <cstdint>
    #include <fstream>
    #include <string>
    #include <vector>
     
    using bytes = std::vector<std::byte>;
     
    bytes read_block(uint32_t length,
                     const std::string& filename) {
      std::ifstream is(filename, std::ios::binary);
      bytes data;
      data.resize(length);
      is.read(reinterpret_cast<char*>(data.data()), length);
      return data;
    }
     
     
    int main(){
      std::string nom="toto";
      bytes tampon=read_block(15,nom);
      for(int i=0;i<15;i++)
        std::cout<<tampon[i]<<' ';
      std::cout<<std::endl;
      return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ g++ main.cpp
    main.cpp: In function ‘int main()’:
    main.cpp:23:14: error: no match foroperator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘__gnu_cxx::__alloc_traits<std::allocator<std::byte>, std::byte>::value_type’ {aka ‘std::byte’})
       23 |     std::cout<<tampon[i]<<' ';

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 464
    Par défaut
    Cela montre qu'afficher du binaire dans la console, c'est pas très fino (caractères non imprimables, séquences d'échappement de terminaux, etc...).

    Pourquoi pas utiliser un débogueur ou de "vraies" primitives de logs ,

  15. #15
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 393
    Billets dans le blog
    16
    Par défaut
    c'est que voudrais ajouter les octets du fichier à des string. Le fichier est un fichier texte. C'est si pourri que ça char?

  16. #16
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 393
    Billets dans le blog
    16
    Par défaut
    que pense-tu de ça:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <iostream>
    #include <cstddef>
    #include <fstream>
    #include <string>
    #include <vector>
     
    using bytes = std::vector<std::byte>;
     
    bytes read_block(uint32_t length,
                     const std::string& filename) {
      std::ifstream is(filename, std::ios::binary);
      bytes data;
      data.resize(length);
      is.read(reinterpret_cast<char*>(data.data()), length);
      return data;
    }
     
     
    int main(){
      std::string nom="toto",sortie="";
      bytes tampon=read_block(15,nom);
      for(int i=0;i<15;i++)
        sortie+=(char)tampon[i];
      std::cout<<sortie<<std::endl;
      return 0;
    }

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 464
    Par défaut
    GG, un cast C bien crade, en C++ !!!
    Casser le thermomètre n'a jamais soigné.

    Non, il ne pas faire croire au compilateur qu'on gère la situation quand c'est absolument pas le cas.

    Ce n'est pas un problème de typage que vous avez.
    Vous devez rendre vos "std::byte" contenant du binaire en un truc contenant des chaines de caractères "imprimables".

    C'est l'ambiguïté du char qui fout la merde.
    Avec "std::byte", on ne passe pas du binaire au texte sans s'en rendre compte, et c'est très bien.

    Si c'est bien du binaire, l'affichage en hexadecimal est bien plus cohérent :
    https://stackoverflow.com/questions/9893497/how-to-convert-byte-array-to-hexadecimal-string-in-c


    char, c'est bien pour des caractères, pas pour faire du "void*" du pauvre.

    P.S.: votre fonction read_byte est une abomination en termes de performance.
    Clairement, vos références sur le C++ datent du C with class, non ?

    Et évitez de déclarer plusieurs variables par ligne, SVP.

  18. #18
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 393
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par bacelar Voir le message
    P.S.: votre fonction read_byte est une abomination en termes de performance.

    ça vient du post que tu m'as conseillé de lire: https://codereview.stackexchange.com...nto-vectorbyte

    que me conseilles-tu pour ajouter les octets du fichier dans un string?

  19. #19
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 464
    Par défaut
    que me conseilles-tu pour ajouter les octets du fichier dans un string?
    Si c'est du binaire, ne pas utiliser de string mais un std::vector<std::byte>>.

    Si c'est du texte et que les conversions automatiques des caractères de fin de ligne, des séquences d'échappement, etc... vous arrange, c'est fonction de l'encodage de votre fichier en entré (ASCII US, UTF-8, BOM ou pas, etc...).
    Il y a des primitives dédiées à cela et pas cette antiquité de "std::ifstream".

    ça vient du post que tu m'as conseillé de lire
    Ce n'était qu'un exemple pour montrer une simple lecture de fichier, pas la bible.

    Si vous ne faites pas une API à la SAX qui doit gérer des fichiers XML de plusieurs dizaines de giga, lisez tout le fichier d'un coup. (oui, on vous l'a proposé depuis le début)

  20. #20
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 393
    Billets dans le blog
    16
    Par défaut
    je veux bien charger le fichier en entier, mais Il faut que je puisse faire des strings avec car la classe lexical lit les caractères un par un en suivant des diagrammes de transition, et renvoie une unité lexicale, éventuellement avec un attribut en string, de cette unité lexicale.

    que me conseilles-tu?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. new char[size] aloue plus que size
    Par lastrecrue dans le forum C++
    Réponses: 11
    Dernier message: 25/10/2007, 13h57
  2. Réponses: 9
    Dernier message: 24/05/2007, 16h05
  3. Réponses: 3
    Dernier message: 08/11/2006, 09h54
  4. Problème de buffer avec des int et des char
    Par Lolita59 dans le forum Réseau
    Réponses: 23
    Dernier message: 04/05/2006, 11h09
  5. passer unee struct dans un buffer (char *)
    Par baert dans le forum C++
    Réponses: 2
    Dernier message: 20/02/2006, 21h49

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