Fichier compresser

cs_mitali Messages postés 18 Date d'inscription dimanche 18 février 2007 Statut Membre Dernière intervention 22 février 2011 - 6 août 2007 à 12:17
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

12 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 août 2007 à 13:37
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++
0
cs_mitali Messages postés 18 Date d'inscription dimanche 18 février 2007 Statut Membre Dernière intervention 22 février 2011
6 août 2007 à 14:12
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 août 2007 à 14:41
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++
0
cs_omnia Messages postés 240 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 22 mars 2009
6 août 2007 à 16:12
utilise plutot win32 bye
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
6 août 2007 à 16:29
Ç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++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
6 août 2007 à 16:32
Ce qui ne devrais pas être trop difficile.

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

C++ (@++)<!--
0
cs_mitali Messages postés 18 Date d'inscription dimanche 18 février 2007 Statut Membre Dernière intervention 22 février 2011
6 août 2007 à 16:57
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
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
6 août 2007 à 17:10
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++ (@++)<!--
0
cs_mitali Messages postés 18 Date d'inscription dimanche 18 février 2007 Statut Membre Dernière intervention 22 février 2011
6 août 2007 à 18:08
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;
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
6 août 2007 à 18:44
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++ (@++)<!--
0
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 à 10:56
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
;
0
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
waw c résolu, merci mec ;-)
0
Rejoignez-nous