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
    396
    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 : 396
    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 : 38
    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
    396
    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 : 396
    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
    396
    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 : 396
    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 : 38
    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 508
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    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 493
    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 493
    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
    396
    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 : 396
    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
    396
    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 : 396
    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 493
    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 493
    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
    396
    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 : 396
    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 493
    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 493
    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
    396
    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 : 396
    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
    396
    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 : 396
    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 493
    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 493
    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
    396
    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 : 396
    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 493
    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 493
    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
    396
    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 : 396
    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