Bonjour,
que pensez-vous de ceci:j'ai trouv� �a dans cette page:https://cplusplus.com/reference/istream/istream/seekg/Code:
1
2
3 char * buffer = new char [length]; /code/ delete[] buffer;
Version imprimable
Bonjour,
que pensez-vous de ceci:j'ai trouv� �a dans cette page:https://cplusplus.com/reference/istream/istream/seekg/Code:
1
2
3 char * buffer = new char [length]; /code/ delete[] buffer;
C'�tait tr�s bien y'a 40 ans, depuis on a invent� std::vector.
Bonjour,
C'est une utilisation d'un autre temps. Exemple:
Et bing, tu as une fuite m�moire!Code:
1
2
3 char* buffer = new char[length]; double d = std::stod( "hello" ); // => exception et le delete n'est jamais fait! delete[] buffer;
Il a plein d'autres mani�res possible par exemple:
Code:
1
2 std::vector<char> buffer(length); /*code*/
comment charger un tampon en vector depuis un fichier? Avec une boucle?
merci pour la r�ponse.
Si je compile ceci:�a donne � la compilation:Code:
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; }
une id�e?Code:
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); | ~~~~~~~~~~~^~~
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 ?
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
Merci Boosk, �a marche:
Code:
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; }
Citation:
Pour un buffer/tampon, moi, je serais plus sur du std::byte que du "char" tout moisi du C.
�a donne:Code:
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; }
Code:
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*
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
Code:
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:
1
2
3
4 $ g++ main.cpp main.cpp: In function int main(): main.cpp:23:14: error: no match for operator<< (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]<<' ';
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 ,
c'est que voudrais ajouter les octets du fichier � des string. Le fichier est un fichier texte. C'est si pourri que �a char?
que pense-tu de �a:
Code:
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; }
GG, un cast C bien crade, en C++ !!! :aie:
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.
�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?
Si c'est du binaire, ne pas utiliser de string mais un std::vector<std::byte>>.Citation:
que me conseilles-tu pour ajouter les octets du fichier dans un string?
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".
Ce n'�tait qu'un exemple pour montrer une simple lecture de fichier, pas la bible.Citation:
�a vient du post que tu m'as conseill� de lire
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)
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?