String vers const char* [Résolu]

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

1 réponse

Meilleure réponse
Messages postés
5173
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
21 août 2019
791
2
Merci
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

Dire « Merci » 2

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 58648 internautes nous ont dit merci ce mois-ci

Gryfbane
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 !
[Dal]
Messages postés
5173
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
21 août 2019
791 -
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
Gryfbane
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 !!
Commenter la réponse de [Dal]