IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Trier un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 40
    Par défaut Trier un fichier
    Bonjour à tous.

    Je travail actuellement sur un dictionnaire de mot. L'écriture et la lecture de mon fichier ne me pose pas de problème.

    J'essaie en vain de trier mon fichier mais celui n'ai pas trié ou alors partiellement ..

    Pour ce qui est l'environnement et la compilation je travail sous linux et je compil avec gcc -Wall ect ...

    Voici les fonctions que j'utilise pour le tri :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    /**
    *  Renvoie le nombre de ligne du fichier
    **/
    int nombre_lignes()
    {
    	FILE* monFichier = NULL;
    	char motLu[LENGTH_MOT_MAX];
    	int nbLignes = 0;
     
    	monFichier = fopen("dictionnaires.txt", "r");
    	if(monFichier == NULL)
    	{
    		return 0;
    	}
     
    	while(fgets(motLu, LENGTH_MOT_MAX, monFichier) != NULL)
    	{
    		nbLignes++;
    	}
     
    	fclose(monFichier);
     
    	return nbLignes;
    }
     
    /**
    *  Compare 2 chaînes de caractère
    **/
    int compareString(const void* str1, const void* str2)
    {
    	// renvoie 0 si chaîne identique
    	// renvoie un nombre positif si les caractères de la chaîne 1 sont supérieur à ceux de la chaîne 2
    	// renvoie un nombre négatif sinonn
     
     	return strcmp((char*)(str1), (char*)(str2) );
    }
     
    /**
    * Tri du fichier par ordre croissant
    **/
    void tri_dico()
    {
    	FILE *monFichier = NULL;
    	monFichier = fopen("dictionnaires.txt", "r");
    	char motLu[LENGTH_MOT_MAX];
    	char **tableauDeMot; // Tableau de tableau de char
    	int nb_lignes = 0;
    	int i, j = 0;
     
    	if(monFichier == NULL)
    		printf("Problème lors de la lecture du fichier");
    	else
    	{
    		nb_lignes = nombre_lignes();
     
    		// Allocation mémoire pour l'ensemble des nb_lignes du fichiers
    		if(nb_lignes > 0)
    			tableauDeMot = malloc(nb_lignes * sizeof(char *));
    		if(tableauDeMot == NULL)
    			printf("Erreur");
    		else
    		{
    			// Allocation mémoire des i lignes du fichiers
    			for(i=0;i<nb_lignes;i++)
    			{
    				tableauDeMot[i] = malloc(LENGTH_MOT_MAX * sizeof(char));
    				if(tableauDeMot[i] == NULL)
    					printf("Erreur");
    			}
     
    			// Copie des mots dans le tableau
    			while(fgets(motLu, LENGTH_MOT_MAX, monFichier) != NULL)
    			{
    				strcpy(tableauDeMot[j], motLu);
    				j++;
    			}
     
    			fclose(monFichier);
     
    			qsort(tableauDeMot, nb_lignes, sizeof(*tableauDeMot), compareString);
     
    			for(i=0;i<nb_lignes;i++)
    				printf("%s", tableauDeMot[i]);	
    		}
    	}
    	// On libère la mémoire
    	for(i=0;i<nb_lignes;i++)
    	{
    		free(tableauDeMot[i]);
    	}
     
    	free(tableauDeMot);
    }
    En vous remerciant de votre aide.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    J'ai testé avec un fichier à 3 mots, le résultat est correct. As-tu un fichier de dictionnaire plus complet pour le test ? Tu peux mettre des pièces jointes ton message.

    Ta façon de gérer le fichier n'est pas correct. Le nom est en dur à 2 endroits, tu l'ouvres et tu le fermes. Il devrait y avoir une fonction d'ouverture et ensuite tu promènes le descripteur de fichier de fonctions en fonctions (en le passant en paramètre). Pour le refermer, il y aurait une fonction de fermeture. Idéalement, tu devrais aussi simplifier ta fonction de tri. Il pourrait y avoir une fonction de chargement en mémoire, une fonction de tri, une fonction d'affichage, une fonction de réécriture du "nouveau" fichier, etc. Ici, le code reste assez court donc ça peut encore aller mais une fonction devrait avoir un seul rôle et garder une complexité faible.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 25
    Par défaut
    Bonjour,

    Voici quelques remarques qui n'ont rien à voir avec le contenu de ton code mais qui restent tout de même intéressantes. Tout d'abord, ton code est très bien indenté ; les félicitations du jury te sont donc accordées. Par contre, tu ne nous indiques pas quels headers tu utilise dans ta bibliothèque de fonctions. Comme quoi il faut qu'on aille chercher nous-même : c'est pas gentil han ça.

    De plus ta fonction compareString, à ton avis, que fait-elle ? Évidemment elle compare des chaînes de caractères. Tu peux donc comprendre que l'entête de ta fonction n'est pas très correcte ; utilises directement des const char* : cela t'évitera de devoir faire des casts. De même, à mon humble avis, les entêtes de tes fonctions nombre_lignes et tri_dico ne sont pas très correctes. Figures-toi qu'une bibliothèque de fonctions est sensée être réutilisable alors penses à passer le nom du fichier (ici dictionnaire.txt) en paramètre à tes fonctions. Et d'ailleurs, imagines un peu que ton dictionnaire contienne plus de 700000 mots (oui le dernier dico. que m'a soumis un prof en contenait environ 800000, soit 800000 lignes). Dans ce cas, ton code sera-t-il toujours fonctionnel ? Ne buggera-t-il pas ? Je pense que oui et une meilleure solution consisterait à mapper d'abord le contenu du fichier en mémoire avant de le traiter. Mais c'est surtout une question d'esthétique ça ; et n'étant pas très sûr de ce que j'avance, je préfère laisser les autres vaillants internautes en débattre. Enfin, tu ne nous renseignes pas sur le rôle de ta variable LENGHT_MOT_MAX mais on a qu'en même pu deviner.

    Voici donc un début de remarques. L'essentiel (concernant le contenu du code) viendra plus tard.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    De plus ta fonction compareString, à ton avis, que fait-elle ? Évidemment elle compare des chaînes de caractères. Tu peux donc comprendre que l'entête de ta fonction n'est pas très correcte ; utilises directement des const char* : cela t'évitera de devoir faire des casts
    Je me suis dit la même chose. Et j'ai vu qsort().

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 40
    Par défaut
    Merci de vos réponses.

    Ce code étant pour m’entraîner je n'ai pas un grand dictionnaire, j'y ai mis juste quelques mots pour tester

    Exemple :

    ESSAIE
    TESTS
    ORDINATEUR
    PROTOCOLE
    FICHIERS

    Qui après appel de ma fonction de tri s'affiche :

    PROTOCOLE
    FICHIERS
    ESSAIE
    TESTS
    ORDINATEUR

    Ensuite pour ce qui est de mes fonctions c'est vrai que j'avais pensé à passer mon fichier en paramètre et faire différents fonctions, dont une pour l'affichage, une pour le chargement mémoires, une pour le tri ect...

    Mais étant en test je voulais le faire une fois que ma fonction de tri s'exécutais correctement.

    Pour ce qui est de mes headers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<ctype.h>
     
    #include "dico.h"
    LENGHT_MOT_MAX étant défini dans "dico.h" et étant la longueur max d'un mot.

    Je prends note des remarques et je vais commencer par créer une fonction d'ouverture et fermeture de fichiers.

    Pour ce qui est de ma fonction d'ouverture il faut qu'en paramètre je lui envoie le fichier et le mode ?

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 40
    Par défaut
    Je me suis essayé à une fonction pour ouvrir et fermer un fichier, je suis sur la bonne route ou alors ce n'ai pas correct ce que j'ai codé ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    FILE *ouverture_fichier(const char* fic, char* mode)
    {
    	FILE *monFichier = NULL;
    	monFichier = fopen(fic, mode);
     
    	return monFichier;
    }
     
    void fermeture_fichier(FILE *fic)
    {
    	fclose(fic);
    }

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 25
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Je me suis dit la même chose. Et j'ai vu qsort().
    Il y a en effet qsort mais je parle ici de la fonction de compparaison qui, à mon humble avis, devrait ressembler à ce qui suit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int
    compareString(const char* str1, const char* str2) { // à mon avis, pas besoin de void*
        return strcmp(str1, str2) ;
    }
    Par ailleurs, ton code de tri ne fonctionne pas (désolé de te le balancer juste comme ça). J'ai essayé avec ceci :

    ESSAIE
    TESTS
    ORDINATEUR
    PROTOCOLE
    FICHIERS


    Le résultat est cela :

    PROTOCOLE
    TESTS
    FICHIERS
    ORDINATEUR
    ESSAIE


    Le bon tri devrait être ce qui suit non ?

    TESTS
    PROTOCOLE
    ORDINATEUR
    FICHIERS
    ESSAIE


    Et lorsqu'on ajoute des lettres minuscules ou autres caractères au fichier, alors là c'est la catastrophe.

    Quant à mes remarques dans mon post précédent, voici ce à quoi je faisais allusion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int
    nombre_lignes(const char *fname)
    {
        FILE* monFichier = NULL ;
        char motLu[LENGTH_MOT_MAX] ;
        int nbLignes = 0 ;
     
        monFichier = fopen(fname, "r") ;
     
        [...]
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void
    tri_dico(const char *fname)
    {
        FILE *monFichier = NULL;
        monFichier = fopen(fname, "r");
        char motLu[LENGTH_MOT_MAX];
     
        [...]
    }
    Je verrais ce que je peux ajouter d'autres plus tard.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 40
    Par défaut
    Oui mon tri ne marche pas, je suis entrain d'apporter des modifications.

    Pour ce qui est des minuscules j'ai déjà traité le problème je converti tout en majuscule avant de l'écrire dans le fichier.

    Mes fonctions d'ouverture et fermeture sont elles d'une utilités ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trier un fichier
    Par Premium dans le forum C
    Réponses: 12
    Dernier message: 23/01/2006, 09h12
  2. trier des fichiers avec un tableau flexgrid
    Par digger dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 08/12/2005, 15h20
  3. Trier un fichier
    Par enicnath dans le forum Général Python
    Réponses: 5
    Dernier message: 10/11/2005, 17h31
  4. [XSLT] - Trier un fichier sur plusieurs critères
    Par ytse dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/10/2005, 16h26
  5. Trier les fichiers par type et les afficher par groupe ...
    Par KneXtasY dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 18/09/2005, 18h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo