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

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

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.