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 :

Probleme de lecture dans un fichier .


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Probleme de lecture dans un fichier .
    Salut Tout le monde !

    Bon mon Problème est le suivant , j'essaie de lire a partir d'un fichier de mots ces mots et les mettre dans d'autre fichier en fonction du nombre de caractères de chaque mot ,sans oublier d'enlever les mots contenant des caractères avec des accents ('é','è'...)

    voila mon code entier:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
     
    int motValable (char *mot)
    {
        int i,j=strlen(mot);
        for (i=0;i<j;i++)
        {
            if (mot[i]<'a' && mot[i]>'z')
            {
                return 0;
            }
        }
        return 1;
    }
    int main()
    {
        FILE *f,*six,*sept,*huit,*neuf,*dix;
        char t[20];
        f=fopen("dic.txt","r");
        six=fopen("6.txt","w");
        sept=fopen("7.txt","w");
        huit=fopen("8.txt","w");
        neuf=fopen("9.txt","w");
        dix=fopen("10.txt","w");
        fseek(f,0,SEEK_SET);
        while (!feof(f))
        {
     
            fscanf(f,"%s \n",t);
            if (motValable(t)){
            if (strlen(t)==6)
            {
                fprintf(six,"%s ",t);
            }
            else if (strlen(t)==7)
            {
                fprintf(sept,"%s \n",t);
            }
            else if (strlen(t)==8)
            {
                fprintf(huit,"%s \n",t);
            }
            else if (strlen(t)==9)
            {
                fprintf(neuf,"%s \n",t);
            }
            else if (strlen(t)==10)
            {
                fprintf(dix,"%s \n",t);
            }         }
        }
     
     
        fclose (f);
        fclose (six);
        fclose (sept);
        fclose (huit);
        fclose (neuf);
        fclose (dix);
        return 0;
    }
    Les Mots sont mis dans les fichier malgré la seg fault , mais ils ne sont pas filtrées , Merci Bonne journée .

  2. #2
    Membre actif Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Points : 222
    Points
    222
    Par défaut
    Dans ta fonction motValable() ça serais mieux un || il me semble. Une lettre peut difficilement être plus grande que 'z' et en même temps plus petite que 'a'.

    Dans le main() j'utiliserais un switch()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    len = strlen(t)
    switch(len)
    {
        case 6: fprintf(six,"%s\n",t); break;
        case 7: fprintf(sept,"%s\n",t); break;
        // etc
    }


    EDIT: En testant je n'ai pas eu de seg fault. Peut être que la taille de t est trop petite pour certain mot.

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 162
    Points
    17 162
    Par défaut
    attention, on ne teste pas avec feof pour la boucle.

    il faut tester le retour de la fonction de lecture, puis, en cas d'erreur, vérifier si feof.

  4. #4
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    En effet, soit dès qu'une lettre n'est pas dans [a,z], ton mot n'est plus valable et tu retournes 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int motValable (char *mot)
    {
        int i,j=strlen(mot);
        for (i=0;i<j;i++)
            if ( !('a'<=mot[i] && mot[i]<='z') )
                return 0;
     
        return 1;
    }
    Soit, tu développes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    !('a'<=mot[i] && mot[i]<='z')
    ce qui revient à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mot[i] < 'a' || mot[i] > 'z'
    et qui est parfaitement la même chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int motValable (char *mot)
    {
        int i,j=strlen(mot);
        for (i=0;i<j;i++)
            if ( mot[i] < 'a' || mot[i] > 'z' )
                return 0;
     
        return 1;
    }

    Aussi, au lieu de recalculer la taille de t à chaque fois : Imagines que tu aies 1000000 de mots et qu'il faut 1/10000de sec pour effectuer l'instruction strlen. Dans le pire des cas tu fais les 5 tests. 5*1/10000*1000000/60 =+- 8min20 de perdu en strlen.
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
     
    int motValable (char *mot)
    {
        int i,j=strlen(mot);
        for (i=0;i<j;i++)
            if (mot[i]>='a' && mot[i]<='z')
                return 0;
     
        return 1;
    }
     
    int main()
    {
        FILE *f,*six,*sept,*huit,*neuf,*dix;
        char t[20];
        f=fopen("dic.txt","r");
        six=fopen("6.txt","w");
        sept=fopen("7.txt","w");
        huit=fopen("8.txt","w");
        neuf=fopen("9.txt","w");
        dix=fopen("10.txt","w");
        fseek(f,0,SEEK_SET);
        while (!feof(f))
        {
            fscanf(f,"%s \n",t);
            if (motValable(t))
            {
                unsigned int len = strlen(t)
                if (len==6)
                    fprintf(six,"%s ",t);
     
                else if (len==7)
                    fprintf(sept,"%s \n",t);
     
                else if (len==8)
                    fprintf(huit,"%s \n",t);
     
                else if (len==9)
                    fprintf(neuf,"%s \n",t);
     
                else if (len==10)
                    fprintf(dix,"%s \n",t);
            }
        }
     
     
        fclose (f);
        fclose (six);
        fclose (sept);
        fclose (huit);
        fclose (neuf);
        fclose (dix);
        return 0;
    }
    Cordialement

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    On peut aussi se passer complètement de l'appel à strlen():
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int motValable (char const *mot)
    {
    	size_t i;
    	for (i=0 ; mot[i] != '\0' ; i++)
    	{
    		if( ! (mot[i]>='a' && mot[i]<='z') )
    			return 0;
    	}
    	return 1;
    }
    On peut aussi remplacer le test par une fonction de <ctype.h> (isalpha(), islower(), etc.)

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci a Vous Problème résolu Merci Énormément

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

Discussions similaires

  1. probleme windows form, lecture dans un fichier texte
    Par fbarbin dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/09/2008, 14h06
  2. Probleme lecture dans un fichier
    Par Diabolikjo dans le forum Langage
    Réponses: 9
    Dernier message: 11/07/2008, 12h08
  3. probleme de lecture dans des fichiers
    Par xanatos dans le forum VB.NET
    Réponses: 1
    Dernier message: 21/03/2008, 15h19
  4. [C# CF1.1]Probleme de lecture dans un fichier texte
    Par Papy_Guik dans le forum Windows Mobile
    Réponses: 10
    Dernier message: 21/05/2007, 17h43
  5. Probleme de lecture dans un fichier
    Par Bebert71 dans le forum C
    Réponses: 7
    Dernier message: 15/01/2007, 19h28

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