Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Utilisation de zlib

2 views
Skip to first unread message

TSalm

unread,
Dec 5, 2009, 5:22:32 PM12/5/09
to
Bonjour,

J'ai ᅵcrit une fonction qui lit un fichier zip et affiche la taille du
fichier dᅵcompressᅵ.
Mais la taille ne correspond pas avec la taille du vrai fichier.

Je ne comprends pas d'oᅵ ᅵa vient, je vous soumets donc mon code :

/* --------------- CODE -------------------- */

void displayContent( char* zFilePath )
{
const unsigned int buffSz = 2048;

unsigned int szRead;
char buffer[ buffSz ];
gzFile gzf = gzopen(zFilePath,"rb");

unsigned long szTotal = 0;

if ( gzf == NULL )
throw exception() ;

while (true)
{
szRead = gzread( gzf, buffer, buffSz );
if ( szRead == 0 || szRead == (unsigned int) -1 )
break;

szTotal += szRead;

// for (unsigned int i=0;i<szRead;++i)
// putchar( buffer[i] ) ;
}

gzclose( gzf );

cout << "Size : " << szTotal << endl;

if ( szRead == (unsigned int) -1 )
throw exception();

}
/* ------------------------------------------------ */

ps: merci de ne pas vous formaliser sur le petit <<cout>>...

D'avance merci pour votre aide.
-TSalm

Samuel Devulder

unread,
Dec 5, 2009, 7:11:12 PM12/5/09
to
TSalm a ᅵcrit :

> Bonjour,
>
> J'ai ᅵcrit une fonction qui lit un fichier zip et affiche la taille du
> fichier dᅵcompressᅵ.
> Mais la taille ne correspond pas avec la taille du vrai fichier.
>
> Je ne comprends pas d'oᅵ ᅵa vient, je vous soumets donc mon code :

C'est pas vraiment un pb de C, mais un pb d'api.

> if ( gzf == NULL )
> throw exception() ;

Hum pas trᅵs C ce throw...

>
> while (true)
> {
> szRead = gzread( gzf, buffer, buffSz );
> if ( szRead == 0 || szRead == (unsigned int) -1 )
> break;

Et si gzread() retournait -2 ?

Je lis la doc:
Return Value

On success, gzread() shall return the number of bytes
decompressed into buf. If gzread() returns 0, either the
end-of-file has been reached or an underlying read error has
occurred. Applications should use gzerror() or gzeof() to
determine which occurred. On other errors, gzread() shall return
a value less than 0 and and applications may examine the cause
using gzerror().

En cas de pᅵpin ca retourne un truc <0, et pas forcᅵment -1.. Donc si ca
se trouve tu reᅵois un nombre nᅵgatif et tu le traite comme s'il ᅵtait
positif avec toutes les catastrophes qui peut en dᅵcouler.

De toute faᅵon il ne faut pas jouer avec les unsigned sauf si on sait ce
qu'on fait trᅵs prᅵcisᅵment. Bref, passe szRead ᅵ signed, fais un test
avec <=0, et tout devrait rentrer dans l'ordre je pense.

sam.

TSalm

unread,
Dec 6, 2009, 3:01:23 PM12/6/09
to
Le Sun, 06 Dec 2009 01:11:12 +0100, Samuel Devulder
<samuel-do...@geensys.com> a ᅵcrit:

> TSalm a ᅵcrit :
>> Bonjour,
>> J'ai ᅵcrit une fonction qui lit un fichier zip et affiche la taille du
>> fichier dᅵcompressᅵ.
>> Mais la taille ne correspond pas avec la taille du vrai fichier.
>> Je ne comprends pas d'oᅵ ᅵa vient, je vous soumets donc mon code :
>
> C'est pas vraiment un pb de C, mais un pb d'api.
>
>> if ( gzf == NULL )
>> throw exception() ;
>
> Hum pas trᅵs C ce throw...
>

Oui. J'avoue que j'utilise certains mᅵcanismes C++.

>> while (true)
>> {
>> szRead = gzread( gzf, buffer, buffSz );
>> if ( szRead == 0 || szRead == (unsigned int) -1 )
>> break;
>
> Et si gzread() retournait -2 ?
>
> Je lis la doc:
> Return Value
>
> On success, gzread() shall return the number of bytes
> decompressed into buf. If gzread() returns 0, either the
> end-of-file has been reached or an underlying read error has
> occurred. Applications should use gzerror() or gzeof() to
> determine which occurred. On other errors, gzread() shall return
> a value less than 0 and and applications may examine the cause
> using gzerror().
>
> En cas de pᅵpin ca retourne un truc <0, et pas forcᅵment -1.. Donc si ca
> se trouve tu reᅵois un nombre nᅵgatif et tu le traite comme s'il ᅵtait
> positif avec toutes les catastrophes qui peut en dᅵcouler.
>

Merci. J'ai changᅵ en unsigned int.
D'autant que mon buffer ne peut pas retourner une taille supᅵrieure ᅵ
celle d'un signed int.

> De toute faᅵon il ne faut pas jouer avec les unsigned sauf si on sait ce
> qu'on fait trᅵs prᅵcisᅵment. Bref, passe szRead ᅵ signed, fais un test
> avec <=0, et tout devrait rentrer dans l'ordre je pense.

En fait, ca ne me retourne mᅵme pas d'erreur.
Le problᅵme vient en fait du format de mon fichier : la zlib ne gᅵre pas
les fichiers zip.
Et si elle ne sait pas gᅵrer le format compressᅵ d'un fichier, il retourne
le fichier non dᅵcompressᅵ :
gzopen can be used to read a file which is not in gzip format ; in this
case gzread will directly read from the file without decompression.

J'aurais prᅵfᅵrᅵ qu'il me retourne une erreur...
en tout cas merci.

-ed-

unread,
Dec 7, 2009, 4:46:00 AM12/7/09
to
On 6 déc, 21:01, TSalm <ts...@free.fr> wrote:
> >>   if ( gzf == NULL )
> >>     throw exception() ;
>
> > Hum pas très C ce throw...
>
> Oui. J'avoue que j'utilise certains mécanismes C++.

Ce qui signifie que tu n'utilises pas un compilateur C, et donc que tu
t'es trompé de groupe. De toutes façons, tu a un problème de
bibliothèque applicative et non de langage. Je suggère de lire la doc
à fond (plusieurs fois) et d'expérimenter pas à pas.


TSalm

unread,
Dec 7, 2009, 9:43:28 PM12/7/09
to
>> >> if ( gzf == NULL )
>> >> throw exception() ;
>>
>> > Hum pas trᅵs C ce throw...
>>
>> Oui. J'avoue que j'utilise certains mᅵcanismes C++.

>
> Ce qui signifie que tu n'utilises pas un compilateur C, et donc que tu
> t'es trompᅵ de groupe.

Ca reste une bibliothᅵque C. De plus, j'utilise une syntaxe C. Ca aurait
trᅵs bien pu ᅵtre un problᅵme C je penses.

> De toutes faᅵons, tu a un problᅵme de
> bibliothᅵque applicative et non de langage. Je suggᅵre de lire la doc
> ᅵ fond (plusieurs fois) et d'expᅵrimenter pas ᅵ pas.
>
Oui. Effectivement.
Mais la documentation n'est pas toujours complᅵte. Pour preuve, il est
possible de vᅵrifier que le fichier est bien dans un format lisible par la
zlib, mais cette fonction n'est pas documentᅵe sur le site de la zlib.

Il s'agit de la fonction :

ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
/*
Returns 1 if file is being read directly without decompression,
otherwise
zero.
*/

En espᅵrant que ᅵa puisse aider quelqu'un d'autre.

-TSalm

0 new messages