[c bzlib] lire et écrire un fichier compressé

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 645 fois - Téléchargée 19 fois

Contenu du snippet

Salut, voila 2 fonctions qui montre comment lire et écrire un fichier compressé. Ca permet de faire perdre 80% du poid de votre fichier. Il faut installer la bzlib. Sous linux il suffit de taper en console "apt-get install libbz2-dev" en mode super utilisateur ( précédez la commande de sudo si vous êtes sous ubuntu et cie ). Pour compiler votre programme il faut linker /usr/lib/libbz2.a ou /usr/lib/libbz2.so au choix !

Bonne prog !

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <bzlib.h>

int write_file_comp(char *filename, char *content); // retourne 0 en cas de succès et moins de 0 si une erreur est survenue
int read_file_comp(char *filename, char *buffer, int bufsize); // retourne 0 en cas de succès et moins de 0 si une erreur est survenue

int main()
{
	char buffer[20];
	write_file_comp("test.bz2", "Test reussi !");
	read_file_comp("test.bz2", buffer, 20);
	printf("%s\n", buffer);
	return 0;
}
int write_file_comp(char *filename, char *content)
{
	FILE *file;
	BZFILE *bzfile;
	int bzerr;
	unsigned int nbytes_in, nbytes_out;

	file = fopen(filename, "wb"); // wb signifie qu'on ouvre en mode écriture binaire mais sous linux le b est facultatif car les fichiers sont ouvert systhématquement en mode binaire
	if(!file) // impossible d'ouvrir le fichier 
	{
		fclose(file);
		return -1;
	}

	bzfile = BZ2_bzWriteOpen(&bzerr, file, 9, 0, 30);
	if(bzerr != BZ_OK) // impossible de réouvrir le fichier avec bz2
	{
		BZ2_bzWriteClose(&bzerr, bzfile, 1, &nbytes_in, &nbytes_out);
		fclose(file);
		return -2;
	}

	BZ2_bzWrite(&bzerr, bzfile, content, strlen(content));
	if(bzerr == BZ_IO_ERROR) // problème lors de l'écriture
	{
		BZ2_bzWriteClose(&bzerr, bzfile, 1, &nbytes_in, &nbytes_out);
		fclose(file);
		return -3;
	}
	BZ2_bzWriteClose(&bzerr, bzfile, 0, &nbytes_in, &nbytes_out);
	fclose(file);
	return 0;
}

int read_file_comp(char *filename, char *buffer, int bufsize)
{
	FILE *file;
	BZFILE *bzfile;
	int bzerr, n;

	file = fopen(filename, "rb");
	if(!file) // impossible d'ouvrir le fichier
	{
		fclose(file);
		return -1;
	}

	bzfile = BZ2_bzReadOpen(&bzerr, file, 0, 0, NULL, 0);
	if(bzerr != BZ_OK) // impossible de réouvrir le fichier avec bz2
	{
		BZ2_bzReadClose(&bzerr, bzfile);
		fclose(file);
		return -2;
	}

	while(bzerr == BZ_OK)
	{
		n = BZ2_bzRead(&bzerr, bzfile, buffer, bufsize);
		if(bzerr == BZ_OK)
		{
			int l;
			buffer[n] = '\0';

			/* remplace les octets nuls par des espaces */
			while(n < (l = strlen(buffer))){buffer[l] = ' ';}
		}
		if(bzerr != BZ_STREAM_END) // problème lors de la lecture
		{
			BZ2_bzReadClose(&bzerr, bzfile);
			fclose(file);
			return -2;
		}
		else
		{
			int l;
			buffer[n] = '\0';

			/* remplace les octets nuls par des espaces */
			while(n < (l = strlen(buffer))){buffer[l] = ' ';}
		}
		BZ2_bzReadClose(&bzerr, bzfile);
		fclose(file);
		return 0;
	}
}

Conclusion :


BZFILE *BZ2_bzWriteOpen(int *bzerror, FILE *f, int blockSize100k, int verbosity, int workFactor);

void BZ2_bzWrite(int *bzerror, BZFILE *b, void *buf, int len);

void BZ2_bzWriteClose) (int *bzerror, BZFILE *b, int abandon, unsigned int *nbytes_in, unsigned int *nbytes_out);

BZFILE *BZ2_bzReadOpen(int *bzerror, FILE *f, int verbosity, int small, void *unused, int nUnused);

int BZ2_bzRead(int *bzerror, BZFILE *b, void *buf, int len);

void BZ2_bzReadClose(int *bzerror, BZFILE *b );

A voir également

Ajouter un commentaire

Commentaires

cs_Alain Proviste
Messages postés
908
Date d'inscription
jeudi 26 juillet 2001
Statut
Modérateur
Dernière intervention
1 février 2015
1 -
"Ca permet de faire perdre 80% du poid de votre fichier."

donc en appliquant 6 fois la compression , je devrais pouvoir réduire mon fichier à 25% de sa taille d'origine.
Zestyr
Messages postés
467
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
17 octobre 2011
-
Biensure tu peux même le faire 20 fois si ça te chantes xp
Bonjour,

j'ai remarqué que la lecture et l'écriture dans le fichier est plus coûteuse qu'avec les méthodes classiques. Plus le fichier est volumineux plus on prend du temps pour le lire.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.