Fichier compresser

Signaler
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011
-
cs_mitali
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011
-
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

12 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
17
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++
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011

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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
17
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++
Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009

utilise plutot win32 bye
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Ç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++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Ce qui ne devrais pas être trop difficile.

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

C++ (@++)<!--
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011

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
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
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++ (@++)<!--
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011

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;
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
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++ (@++)<!--
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011

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
;
Messages postés
18
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
22 février 2011

waw c résolu, merci mec ;-)