String vers const char* [Résolu/Fermé]

Signaler
Messages postés
29
Date d'inscription
dimanche 25 octobre 2015
Statut
Membre
Dernière intervention
15 août 2019
-
Messages postés
29
Date d'inscription
dimanche 25 octobre 2015
Statut
Membre
Dernière intervention
15 août 2019
-
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

Messages postés
5394
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
31 juillet 2020
891
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 58239 internautes nous ont dit merci ce mois-ci

Messages postés
29
Date d'inscription
dimanche 25 octobre 2015
Statut
Membre
Dernière intervention
15 août 2019
1
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 !
Messages postés
5394
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
31 juillet 2020
891
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
Messages postés
29
Date d'inscription
dimanche 25 octobre 2015
Statut
Membre
Dernière intervention
15 août 2019
1
C'est tout bon, merci beaucoup !!