Sie sind auf Seite 1von 7

/*

***Les fichiers***

Exercice 6

Ecrire un programme qui charge les mots du fichier mot.txt de


l'exercice précédent en mémoire,

les trie (tri à bulle par exemple) et les écrit dans un deuxième fichier
mot_trier.txt.

Les mots seront mémorisés en créant un liste chaînée.

*/

//Correction

//

//Inclusion de la bibliothèque standard

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define TAILLE_MAX 50

/*Definition de la structure*/

typedef struct ListMots ListMots;

struct ListMots
{

char mots[TAILLE_MAX];

ListMots *suiv;

};

//Création de la fonction principale du programme

int

main ()

/*Déclaration des variables.*/

FILE *fichier;

char m[TAILLE_MAX];

/*Ouverture du fichier*/

fichier = fopen("mots.txt", "r");

/*On verifie si l'ouverture a marché*/

if(fichier != NULL)

/*On mémorise les noms*/

ListMots *tabMots = NULL,

*nvElmt,

2
*dernElmt

/*On lit les mots du fichier mot.txt*/

while(fgets(m, TAILLE_MAX-1, fichier) != NULL)

/*On fait une allocation de memoire*/

nvElmt = malloc(sizeof(*nvElmt));

if (nvElmt != NULL)

/*ON charge le mot courant*/

strcpy(nvElmt->mots, m);

nvElmt->suiv = NULL;

if (tabMots == NULL)

tabMots = nvElmt;

else

dernElmt->suiv = nvElmt;

3
}

dernElmt = nvElmt;

else

printf("Allocation impossible\n");

exit(EXIT_FAILURE); // On quitte le programme

/*On verifie si la liste chaînée de nom n'est pas vide avant de


trier ses éléments*/

if (tabMots != NULL)

FILE *fichierTrier;/*Pointeur sur le nouveau fichier*/

int echange;

ListMots *tmp;

char str[TAILLE_MAX];

4
/*On effectue le trie de la liste*/

do

echange = 0;

tmp = tabMots;

/*Tant qu'on est pas à la fin de la liste*/

while(tmp != NULL)

/*On comprare le champ courant avec son suivant mais


d'abord on verifie si le suivant n'est pas NULL*/

if (tmp->suiv != NULL && strcmp(tmp->mots, tmp->suiv-


>mots) > 0)

/*on effectue l'echange*/

strcpy(str, tmp->mots);

strcpy(tmp->mots, tmp->suiv->mots);

strcpy(tmp->suiv->mots, str);

echange = 1;

/*On passe à l'élément suivant */

5
tmp = tmp->suiv;

}while(echange);

/*Une fois les noms triés on les enregistre dans le nouveau


fichier*/

fichierTrier = fopen("mot_trier.txt", "w");

if (fichierTrier != NULL)

tmp = tabMots;

while(tmp != NULL)

fputs(tmp->mots, fichierTrier);

tmp = tmp->suiv;

fclose(fichierTrier);

/*Un fois le nouveau fichier fermé on libère la mémoire


allouée*/

free(nvElmt);

6
fclose(fichier);

else/*Si l'ouverture n'a pas marche on arrete le programme*/

printf("Erreur lors de l'ouverture du fichier\n");

exit(EXIT_FAILURE); // On q