String vers const char*

Résolu/Fermé
Gryfbane Messages postés 29 Date d'inscription dimanche 25 octobre 2015 Statut Membre Dernière intervention 15 août 2019 - 4 juil. 2019 à 01:20
Gryfbane Messages postés 29 Date d'inscription dimanche 25 octobre 2015 Statut Membre Dernière intervention 15 août 2019 - 1 août 2019 à 17:30
Bonjour à tous,
j'ai ce petit programme qui me fais des misères :
const char* content;

std::ifstream in("Archive.zip");
std::string c((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
std::cout << c;
content = c.c_str();
std::cout << content;


pour c il m'affiche :
,\256\217l\212\234dPq\227\224B\223\351|w]\230\243%\373\324Z\351\341\246&\376<OH\254;\202JƆ\223\345i\310\206u\236\277k/\243\233	\251/\254\2465\234\347\323!\214\345l\225	\315\w\217\3368\2176\344\302~\355\321&1\345V\357i\216h/dۙ=0\300\240L\257\225cM4\272:%\276\305\377
L0+(>\314vڇ\2657\3515\2525\210\254\256H\224߂h#\352Ma\365n\261\334^\372Yܸ\3069#÷\26\366i\213j\300\203?\350\316{l.\317\322j\206\261\267\230*^\214\255\347\202k\321JIZ\220+Á\313:\215;\325\315&\3338\311\377\212\332T\274\325Y\363
#]PK\364:"PK

(et j'en passe) et se finit par PK en derniers caractères

puis pour content il m'affiche uniquement PK...
J'ai testé pas mal de solutions (data(), strcopy, etc...) mais je n'ai pas encore réussi à faire marcher ce code... Quelqu'un aurait une idée ?

Merci d'avance !

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 4 juil. 2019 à 10:07
Salut Gryfbane,

Et tu veux faire quoi exactement avec ton archive .zip ?

"PK" sont les initiales de Phil Katz, qui est à l'origine de ce format de compression (son programme s'appelait pkzip, d'ailleurs), et ce que tu vois à l'écran c'est
cout
qui tente d'afficher du texte alors que tu lui passes le contenu binaire du fichier compressé, qui n'est aucunement décompressé par ton code. Au passage, tu vois "PK..", qui est le marqueur de signature du format (en hexadecimal : 0x50 0x4B 0x03 0x04).

https://blog.netspi.com/magic-bytes-identifying-common-file-formats-at-a-glance/

Dal
2
Gryfbane Messages postés 29 Date d'inscription dimanche 25 octobre 2015 Statut Membre Dernière intervention 15 août 2019 1
4 juil. 2019 à 10:27
D'abord, merci pour cette réponse rapide et pour ce point culture, je n'imaginais pas du tout que PK voulais dire quelque chose ! Pour l'utilisation de cette archive, je voulais la copier en sftp avec libssh sur un serveur distant avec la fonction :
sftp_write 	( 	sftp_file  	file,
		const void *  	buf,
		size_t  	count 
	) 	

qui a besoin du contenu du fichier dans un const char, afin de l'écrire dans le fichier distant.

Merci d'avance !
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 4 juil. 2019 à 13:18
comme le fichier .zip contient des données binaires et non du texte, tu dois ouvrir le fichier en mode binaire, ensuite, tu peux déterminer sa taille, allouer un tampon mémoire avec un type compatible avec le 2ème argument de ta fonction et y mettre le contenu du fichier que tu veux passer tel quel à cette fonction.

Comme dans cet exemple ci-dessous adapté du code disponible là http://www.cplusplus.com/reference/istream/istream/tellg/ :

// read a file into memory
#include <iostream>
#include <fstream>

int main () {
  std::ifstream is ("Archive.zip", std::ifstream::binary);
  if (is) {
    // get length of file:
    is.seekg (0, is.end);
    int length = is.tellg();
    is.seekg (0, is.beg);

    // allocate memory:
    char * buffer = new char [length];

    // read data as a block:
    is.read (buffer,length);

    is.close();

    // TODO: calll sftp_write with buffer and length 
    // as 2nd and 3rd parameters

    delete[] buffer;
  }

  return 0;
}

(non testé)

Dal
0
Gryfbane Messages postés 29 Date d'inscription dimanche 25 octobre 2015 Statut Membre Dernière intervention 15 août 2019 1
1 août 2019 à 17:30
C'est tout bon, merci beaucoup !!
0