Utilisation d'entiers 64 pour le stockage de la taille
This commit is contained in:
parent
16266d3f9a
commit
b9b9e35115
|
@ -2,6 +2,7 @@
|
||||||
#define __IN303_BUFFER_H__
|
#define __IN303_BUFFER_H__
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tampon permettant d'abstraire l'écriture dans un fichier bit par
|
* Tampon permettant d'abstraire l'écriture dans un fichier bit par
|
||||||
|
@ -20,7 +21,7 @@ struct WriteBuffer {
|
||||||
|
|
||||||
// Nombre d'octets écrits par le tampon d'écriture dans le
|
// Nombre d'octets écrits par le tampon d'écriture dans le
|
||||||
// fichier, correspondant au nombre de vidages du tampon
|
// fichier, correspondant au nombre de vidages du tampon
|
||||||
size_t flushed_count;
|
uint64_t flushed_count;
|
||||||
|
|
||||||
// Fichier dans lequel le tampon d'éciture est vidé à l'appel
|
// Fichier dans lequel le tampon d'éciture est vidé à l'appel
|
||||||
// de `flushBuffer` ou au débordement
|
// de `flushBuffer` ou au débordement
|
||||||
|
@ -48,7 +49,7 @@ void flushBuffer(WriteBuffer*);
|
||||||
* Récupère le nombre de vidages effectués sur le tampon d'écriture,
|
* Récupère le nombre de vidages effectués sur le tampon d'écriture,
|
||||||
* correspondant au nombre d'octets écrits par le tampon dans le fichier
|
* correspondant au nombre d'octets écrits par le tampon dans le fichier
|
||||||
*/
|
*/
|
||||||
size_t getFlushedCount(WriteBuffer*);
|
uint64_t getFlushedCount(WriteBuffer*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tampon permettant d'abstraire le lecture depuis un fichier bit par
|
* Tampon permettant d'abstraire le lecture depuis un fichier bit par
|
||||||
|
|
|
@ -36,7 +36,7 @@ void flushBuffer(WriteBuffer* buffer) {
|
||||||
buffer->flushed_count++;
|
buffer->flushed_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t getFlushedCount(WriteBuffer* buffer) {
|
uint64_t getFlushedCount(WriteBuffer* buffer) {
|
||||||
return buffer->flushed_count;
|
return buffer->flushed_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Effectuer un comptage des caractères dans le corpus d'entrée. En déduire
|
* Effectuer un comptage des caractères dans le corpus d'entrée. En déduire
|
||||||
|
@ -16,7 +18,7 @@
|
||||||
*
|
*
|
||||||
* (résultat à libérer avec `free`)
|
* (résultat à libérer avec `free`)
|
||||||
*/
|
*/
|
||||||
static double* _createFrequencies(FILE*, size_t*);
|
static double* _createFrequencies(FILE*, uint64_t*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encoder le fichier d'entrée vers le fichier de sortie
|
* Encoder le fichier d'entrée vers le fichier de sortie
|
||||||
|
@ -25,7 +27,7 @@ static double* _createFrequencies(FILE*, size_t*);
|
||||||
*/
|
*/
|
||||||
static void _encodeFromTable(char**, FILE*, WriteBuffer*);
|
static void _encodeFromTable(char**, FILE*, WriteBuffer*);
|
||||||
|
|
||||||
double* _createFrequencies(FILE* file, size_t* total) {
|
double* _createFrequencies(FILE* file, uint64_t* total) {
|
||||||
double* frequencies = malloc(NUM_CHARS * sizeof(*frequencies));
|
double* frequencies = malloc(NUM_CHARS * sizeof(*frequencies));
|
||||||
*total = 0;
|
*total = 0;
|
||||||
|
|
||||||
|
@ -76,7 +78,7 @@ void compress(FILE* source, FILE* dest) {
|
||||||
// compression moins optimale.
|
// compression moins optimale.
|
||||||
// FIXME: éviter la division par zéro pour les fichiers vides
|
// FIXME: éviter la division par zéro pour les fichiers vides
|
||||||
printVerbose("Calcul des fréquences d'apparition des caractères.\n");
|
printVerbose("Calcul des fréquences d'apparition des caractères.\n");
|
||||||
size_t start_bytes = 0;
|
uint64_t start_bytes = 0;
|
||||||
double* frequencies = _createFrequencies(source, &start_bytes);
|
double* frequencies = _createFrequencies(source, &start_bytes);
|
||||||
|
|
||||||
if (isVerbose()) {
|
if (isVerbose()) {
|
||||||
|
@ -113,7 +115,7 @@ void compress(FILE* source, FILE* dest) {
|
||||||
WriteBuffer output = createWriteBuffer(dest);
|
WriteBuffer output = createWriteBuffer(dest);
|
||||||
printVerbose("\nÉcriture des données compressées.\n");
|
printVerbose("\nÉcriture des données compressées.\n");
|
||||||
|
|
||||||
// - Entier : nombre d'octets dans le fichier originel
|
// - Entier 64 bits : nombre d'octets dans le fichier originel
|
||||||
fwrite(&start_bytes, sizeof(start_bytes), 1, dest);
|
fwrite(&start_bytes, sizeof(start_bytes), 1, dest);
|
||||||
|
|
||||||
// - Arbre linéarisé : arbre de Huffman permettant le calcul de la clef
|
// - Arbre linéarisé : arbre de Huffman permettant le calcul de la clef
|
||||||
|
@ -126,11 +128,11 @@ void compress(FILE* source, FILE* dest) {
|
||||||
flushBuffer(&output);
|
flushBuffer(&output);
|
||||||
|
|
||||||
// ÉTAPE 5 : affichage des statistiques de compression et fin
|
// ÉTAPE 5 : affichage des statistiques de compression et fin
|
||||||
size_t end_bytes = sizeof(start_bytes) + getFlushedCount(&output);
|
uint64_t end_bytes = sizeof(start_bytes) + getFlushedCount(&output);
|
||||||
double gain = ((double) start_bytes - end_bytes) / start_bytes * 100;
|
double gain = ((double) start_bytes - end_bytes) / start_bytes * 100;
|
||||||
|
|
||||||
printVerbose("Taille originelle : %d octets.\n", start_bytes);
|
printVerbose("Taille originelle : %" PRIu64 " octets.\n", start_bytes);
|
||||||
printVerbose("Taille compressée : %d octets.\n", end_bytes);
|
printVerbose("Taille compressée : %" PRIu64 " octets.\n", end_bytes);
|
||||||
printVerbose("Gain : %.2f %% !\n", gain);
|
printVerbose("Gain : %.2f %% !\n", gain);
|
||||||
|
|
||||||
freeTree(tree);
|
freeTree(tree);
|
||||||
|
|
Loading…
Reference in New Issue