Creation et ecriture dans un fichier en C

Bonjour à tous
Je voudrais savoir si quelqu’un pourrait m’aider car j’ai un projet en c ,le but est d’écrire l’algorithme de compression d’après le théorème de shannon-fano.J’ai déjà codé plusieurs fonctions mais une me pose des problèmes.
En fait,j’ai une fonction qui me donne les codages de chaque caractère,par exemple :
a 0 0 0
b 0 1 0
c 1 1 1

j’ai donc définit un tableau à 2 dimensions avec tout les codages,la 1ère colonne c’est le caractère (dans mon exmple a,b et c)et dans les colonnes suivantes,on a le codage.

Ma fonction,doit donc ouvrir le fichier,lire chacun des caractères,regarder dans ce tableau le codage correspondant et écrire dans un nouveau fichier par exemple 000 à la place du a

Par exemple si mon fichier commence par " a b c" mon nouveau fichier va contenir 000 010 111

SVP aidez moi car c’est pour un projet,et je n’ai plus beaucoup de temps pour le rendre.

Je vous remercie par avance pour vos réponses.

:slight_smile:

Tu veux qu’on t’aide à finir ton projet ? ou qu’on le finisse à ta place? Ce qui - de ce que je comprend - revient au même dans ton cas?

je ne veux pas qu’on me fasse mon projet,je demander juste de l’aide.
je sais comment ouvrir les fichiers ,créer le second,ça ça marche,ce que je voudrais c’est qu’on m’aide juste à faire correspondre le caractère à son codage.
Je précise que j’ai déjà commencé la programmation de tout ça.:slight_smile:

Et dernière petite précision : mon programme comprend déjà beaucoup de fonctions pour arriver à celle qui coince.Je dois donc les utiliser pour faire la compression,mais le problème c’est que je n’y arrive pas.Je ne suis pas une glandeuse qui veut qu’on fasse à sa place;je suis juste bloquée :frowning:

bah de ce que je comprend, c’est principalement plus que de l’écriture bit à bit dans un fichier.

Ca ne casse pas trois pattes à un canard, faut utiliser un buffer (un tableau de char typiquement), pour bufferiser l’écriture séquentielle des bits, mais ensuite je peux pas t’aider plus sans “pistes”.


#include "stdio.h"

// quelques helpers
#define BIT(x) (1<<(x))                              // equivalence de décalage
#define setbit(p,b) (p)|=BIT(b)             // positionne le bit b de l'octet p à 1
#define clrbit(p,b) (p)&=~BIT(b)                 // positionne le bit b de l'octet p à 0

#define MAX_CHAR 3
#define MAX_VALUES 4

static const unsigned char shannon_table[MAX_CHAR][MAX_VALUES]  =	{  	{'a', 0,0,0},
						 				{'b', 0,1,0},
										{'c', 1,1,1}
									};

void change_shannon_value(unsigned char * value, int bit, int idx)
{
	if (bit & 1)
		setbit(*(unsigned char*)value, idx);
	else
		clrbit(*(unsigned char*)value, idx);
}

unsigned char getShannon(const char  in) 
{
int i;


	for (i=0; i < MAX_CHAR; i++)
	{
			unsigned char value = shannon_table[i][0];
			if (in == value)
			{
				int bit0 = (int)shannon_table[i][1];
				int bit1 = (int)shannon_table[i][2];
				int bit2 = (int)shannon_table[i][3];

				change_shannon_value(&value, bit0, 0);
				change_shannon_value(&value, bit1, 1);
				change_shannon_value(&value, bit2, 2);

				value -= '0';

				return value;;
			}
	}
	return 0;
}

int main()
{
char value_from_table;

	value_from_table = getShannon('c');
	printf("la valeur de c compresse vaut %c\n", value_from_table);
	system("PAUSE");
	return 0; 
}

Fait à l’arrache, à l’ancienne et pas du tout optimisé.
Edité le 24/04/2008 à 23:17