Fichier compresser

Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011
- - Dernière réponse : cs_mitali
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011
- 7 août 2007 à 14:25
Bonjour tt l monde,
j'ai une fonction qui me premet de récuperer  le contenu d'un fichier ,ça bien marcher avec les fichiers textes mais le probléme c'est que ça marche pas pour les fichiers compresser de type .tar.gz. Le code de la fonction est le suivant:
char* GetContent(
char *adr_fic=
"c:\\test.zip")
{

int size;ifstream fichier(adr_fic,ios::in|ios::binary);

// taille du fichierfichier.seekg(0,ios_base::end);

size= fichier.tellg();

fichier.seekg(0,ios_base::beg);

char * buffer=
new
char[size];buffer[size]=

'\0';

long longfich=size;

for (
int i=0;i<longfich;i+=size){

long nbdonneaenv = (longfich-i>size)?size:longfich-i;fichier.read(buffer,nbdonneaenv);

return buffer;}
Merci pour votre soutien
Afficher la suite 

12 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
char *buffer = newchar[size];
buffer[size] = '\0'; // NIET !!!


char buf[10];
10 octets dispos, de buf[0] jusque buf[10-1];

je stoppe ici.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011
0
Merci
Merci pour ton aide BruNews,Mais est ce que tu peu me donner plus de détail,
je suis nouneau en c++
Merci une autree fois
Commenter la réponse de cs_mitali
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
si tu veux ajouter un octet (0 final dans ton cas, bien que je ne vois pas à quoi servira), faut allouer size+1.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009
0
Merci
utilise plutot win32 bye
Commenter la réponse de cs_omnia
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
Ça donnera quoi de plus s'il refait les mêmes erreurs avec l'API Win32 ?

Je ne comprend rien à cette partie:
long longfich=size;

for (
int i=0;i<longfich;i+=size){

long nbdonneaenv = (longfich-i>size)?size:longfich-i;fichier.read(buffer,nbdonneaenv);

return buffer;}

À quoi sert longfich et surtout, à quoi sert la boucle (avec un return à l'intérieur soit dit en passent) ?

Voici quelque chose de simple:

unsigned char *GetContent (char *filename, int &rbytes)
{
    ifstream file(filename, ios_base::binary);
    if(file.fail()) return 0;

    file.seekg(0, ios_base::end);
    int size = file.tellg();
    file.seekg(0, ios_base::beg);

    unsigned char *buffer = new unsigned char[size];
    if(buffer) {
        file.read((char*)buffer, size);
        rbytes = file.gcount();
    }

    file.close()
    return buffer;
}

Je ne donne aucune explication. Essais de comprendre par toi-même ce qui est fait.

C++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
Ce qui ne devrais pas être trop difficile.

Saleté de police. J'ai toujours eu des problèmes avec elle.

C++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011
0
Merci
Merci SAKingdom,
J'ai utilisé ton code,mais j'ai tjr le même souci, si je donne comme fichier compresser de type .tar.gz ça m'affiche que  2 charactères qui son récuperer du buffer
Commenter la réponse de cs_mitali
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
Non. Buffer contient tout le fichier.
Tu ne peux pas afficher ça comme du texte tout simplement parce que ce n'en est pas voilà tout.
C++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011
0
Merci
Merci bcp,je vais t'éxpliquer mon probléme ,je suis entrain de développer une application qui me permet d'envoyer des fichier tar.gz vers un serveur , je donne donc le contenu dans un buffer mais du coté serveur je reçois le fichier vide ,pour l'envoi j'utilise la fonction HttpSendRequest (winniet.h):

unsigned

char *buffer=0;

buffer=GetContent(
"c:\\test.tar.gz");

int result = HttpSendRequest(m_hRequest, bstrHeaders,strlen(bstrHeaders),buffer,strlen(buffer));

if (result)
return
true;
Commenter la réponse de cs_mitali
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
int
result = HttpSendRequest(m_hRequest, bstrHeaders,strlen(bstrHeaders),buffer, strlen(buffer) );

buffer n'est pas une chaine de caractère.

int size;
unsigned char *buffer = GetContent("c:\\test.tar.gz", size);

int result =

HttpSendRequest(m_hRequest, bstrHeaders,strlen(bstrHeaders),buffer,size);





C++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011
0
Merci
j'ai fais ça mais n'on plus,on tt cas voila mon code en entier si tu peu voir d'ou viens le probleme :



unsigned






char
* CSslConnection::GenerateRequestBody(

int
&tailleTotale,

const
string& firstName,

const
string& lastName,

const
string& filename,

const
string& boundary){

string requestBody;


// Add FirstName

string contentDisposition =




"Content-Disposition: form-data; name="enveloppeFile"; filename=""
+ filename +

"""
;contentDisposition=


"Content-Disposition: form-data; name="chaineHachee""
;

requestBody.append(


"\r\n"
);requestBody.append(


"--"
+ boundary +

"\r\n"
);requestBody.append(contentDisposition +


"\r\n"
);requestBody.append(


"\r\n"
);requestBody.append(firstName +


"\r\n"
);


// Add LasttName

contentDisposition =




"Content-Disposition: form-data; name="LastName" "
;requestBody.append(


"--"
+ boundary +

"\r\n"
);requestBody.append(contentDisposition +


"\r\n"
);requestBody.append(


"\r\n"
);requestBody.append(lastName +


"\r\n"
);


// Add File Content




string contentType =




"Content-Type: application/x-zip-compressed"
;requestBody.append(


"--"
+ boundary +

"\r\n"
);requestBody.append(contentDisposition +


"\r\n"
);requestBody.append(contentType +


"\r\n"
);









int
fileLength;


int
j=requestBody.length();


unsigned



char
* FileContents =0;FileContents=GetFileContents(fileLength,filename





tailleTotale = j+fileLength+2;












unsigned



char
*tab =

new



unsigned



char
[ tailleTotale ];memcpy(tab,requestBody.c_str(), j );


int
k=0, i=0;


for
(i=0;i<fileLength;i++) tab[j+i]=FileContents[i];tab[j+i+1]=


'\r'
;tab[j+i+2]=


'\n';






return
tab;}



bool



CSslConnection::SendHttpsRequest(){

string boundary =


"---------------------------7d22bb3b890472"
;

CHAR bstrHeaders[] =


"Content-Type: multipart/form-data; boundary=---------------------------7d22bb3b890472"
;HttpAddRequestHeaders(m_hRequest, bstrHeaders, -1, HTTP_ADDREQ_FLAG_ADD);


unsigned



char
*wchData =

new



unsigned



char
[];


int
taille;


wchData = GenerateRequestBody(taille,

"MOUSLIM"
,

"MITALI"
,

"c:\\test.txt"
,boundary);


try
{


for
(

int
tries = 0; tries < 1; ++tries) {


int
result = HttpSendRequest(m_hRequest, bstrHeaders,strlen(bstrHeaders),wchData,taille);


if
(result)

return



true
;
Commenter la réponse de cs_mitali
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011
0
Merci
waw c résolu, merci mec ;-)
Commenter la réponse de cs_mitali