Utilisation d'entiers 64 pour le stockage de la taille

This commit is contained in:
Mattéo Delabre 2016-11-20 01:40:24 +01:00
parent 16266d3f9a
commit b9b9e35115
3 changed files with 13 additions and 10 deletions

View File

@ -2,6 +2,7 @@
#define __IN303_BUFFER_H__
#include <stdio.h>
#include <stdint.h>
/**
* 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
// 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
// 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,
* 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

View File

@ -36,7 +36,7 @@ void flushBuffer(WriteBuffer* buffer) {
buffer->flushed_count++;
}
size_t getFlushedCount(WriteBuffer* buffer) {
uint64_t getFlushedCount(WriteBuffer* buffer) {
return buffer->flushed_count;
}

View File

@ -9,6 +9,8 @@
#include <stdio.h>
#include <string.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
@ -16,7 +18,7 @@
*
* (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
@ -25,7 +27,7 @@ static double* _createFrequencies(FILE*, size_t*);
*/
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));
*total = 0;
@ -76,7 +78,7 @@ void compress(FILE* source, FILE* dest) {
// compression moins optimale.
// FIXME: éviter la division par zéro pour les fichiers vides
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);
if (isVerbose()) {
@ -113,7 +115,7 @@ void compress(FILE* source, FILE* dest) {
WriteBuffer output = createWriteBuffer(dest);
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);
// - Arbre linéarisé : arbre de Huffman permettant le calcul de la clef
@ -126,11 +128,11 @@ void compress(FILE* source, FILE* dest) {
flushBuffer(&output);
// É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;
printVerbose("Taille originelle : %d octets.\n", start_bytes);
printVerbose("Taille compressée : %d octets.\n", end_bytes);
printVerbose("Taille originelle : %" PRIu64 " octets.\n", start_bytes);
printVerbose("Taille compressée : %" PRIu64 " octets.\n", end_bytes);
printVerbose("Gain : %.2f %% !\n", gain);
freeTree(tree);