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 :

Recherche d'occurence de caractère dans un fichiers.


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 50
    Points : 31
    Points
    31
    Par défaut Recherche d'occurence de caractère dans un fichiers.
    Salut,


    Je dois écrire un code en c qui permet :

    Recherche d'occurrence de caractère dans un fichier . Ensuite probabilité d'occurrence de chaque caractère .

    Voici le code , pas d'erreur dans la compilation.Mais, à l'éxecution je reçois une erreur !!!!

    Aidez moi .
    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
    # include <stdio.h>
    # include<conio.h>
    # include <io.h>
     
    #define n 26
    FILE * fiche;
    unsigned occ[n];
    char car[n];
    unsigned l ;/* donne la largeur logique du tableau*/
     
    int rechercher (char c, char car [])
    { 
       unsigned i;
     
       i=0;
       while (i<l && car[i]!=c)
          i++;
       if (i<=l)
          return i;
       else
          return -1;
    }
     
    void remplir()
    { 
       char c;
       unsigned i,j;
     
       fiche=fopen("h:\fichier.dat","r");
       i=0;
     
       while ((c=(char) getc(fiche))!=EOF)
       {
          j=rechercher(c ,car);
          if(j==-1)
          { 
             car [i]=c;
             occ[i]=1;
             i++;
          }
          else
             occ[j]++;
       }
     
       fclose(fiche);
    }
     
    float probabilite( char c, char car [])
    {
       unsigned i ;
       unsigned somme;
       unsigned indice ;/* donne l'indice du caractére c*/
       indice=-1;
     
       for(i=0;i<l;i++)
       { 
          somme+=occ[i];
          if (car[i]==c)
             indice=i;
       }
     
       if (indice !=-1)
          return occ[indice];/*somme*/
       else
          return 0;
    }
     
    void main()
    { 
       int i;
     
       fiche=fopen("h:\fichier.dat","w+");
     
       fputs ("bonjour",fiche);
       rewind(fiche);
     
       remplir();
     
       for (i=0;i<l;i++)
          printf("%d",occ[i]);
     
       fclose(fiche);
    }
    Merci d'avance et @+

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par kenza28684 Voir le message
    Voici le code , pas d'erreur dans la compilation.Mais, à l'éxecution je reçois une erreur !!!!
    Pour ma part, il y a bien des problèmes à la compilation :
    Compiling: main.c
    E:\projet\test_DVP\main.c:25: warning: function declaration isn't a prototype
    E:\projet\test_DVP\main.c: In function `remplir':
    E:\projet\test_DVP\main.c:35: warning: comparison between signed and unsigned
    E:\projet\test_DVP\main.c: In function `probabilite':
    E:\projet\test_DVP\main.c:62: warning: comparison between signed and unsigned
    E:\projet\test_DVP\main.c: At top level:
    E:\projet\test_DVP\main.c:69: warning: function declaration isn't a prototype
    E:\projet\test_DVP\main.c:69: error: return type of 'main' is not `int'
    E:\projet\test_DVP\main.c: In function `main':
    E:\projet\test_DVP\main.c:79: warning: comparison between signed and unsigned
    Quelques remarques en vrac :

    * Pourquoi utilises-tu autant de variables globales ?
    * Ce n'est pas void main() main int main(void)
    * Le caractère \ dans une chaîne s'écrit \\. En outre / fonctionne bien pour les chemins de fichier.
    * Tu cherches à ouvrir le fichier fichier.dat dans la fonction remplir alors qu'il a déjà été ouvert et non refermé dans le main.
    * Tu ne testes pas le retour de fopen.

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned l ;/* donne la largeur logique du tableau*/
    Qui a initialisé cette variable globale utilisée un peu partout ???
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre averti Avatar de dorian833
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 223
    Points : 356
    Points
    356
    Par défaut
    Citation Envoyé par kenza28684 Voir le message
    Voici le code , pas d'erreur dans la compilation.Mais, à l'éxecution je reçois une erreur !!!!
    Tu pourrais nous dire s'il t'affiche quelque chose par rapport à l'erreur (erreur acces mémoire, ...) ?

    Une solution que j'utilise pour faire une statistique de caractère dans un ficher :
    - Je créé un tableau d'entier de 256 cases, soit une case par caractère, et je l'initialise à 0 pour toutes les cases
    - Je lis un caractère du fichier et j'incrémente la cases ayant le caractère comme index (ex : si le caractère est 'A', je fait un tab['A']++)
    - Je répète l'opération pour tout les caractères jusqu'à la fin du fichier

    L'avantage est que sa réalise les statistique pour tout les caractères possibles (y compris les caractères invisibles pour un fichier texte).

    Par contre, il faut faire gaffe que le fichier ne soit pas plus grand que ce que peux stocker un 'int'.

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned l ;/* donne la largeur logique du tableau*/
    Qui a initialisé cette variable globale utilisée un peu partout ???
    Une globale est initialisée à 0 par défaut.

    (on voit que tu n'as pas l'habitude d'utiliser les globales ! C'est bien !)
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kenza28684 Voir le message
    Salut,


    Je dois écrire un code en c qui permet :

    Recherche d'occurrence de caractère dans un fichier .
    Ton système de double tableau est un peu compliqué mais assez astucieux. attention, il y a plus de 26 caractères possibles dans un texte (en fait, 128 en ASCII ou 256 dans la plupart des autres charset 8-bit).

    Eviter les globales. Il y a un bug dans la fonction de recherche.

    Ceci fonctionne :
    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
     
    #include <stdio.h>
     
    static int rechercher (int const c, int const car[], unsigned const n)
    {
       unsigned i=0;
     
       while (i < n && car[i] != c)
       {
          i++;
       }
     
       if (i < n)
          return i;
       else
          return -1;
    }
     
    static int remplir (unsigned occ[], int car[])
    {
       int n = 0;
       FILE *fiche = fopen ("fable.txt", "r");
       if (fiche != NULL)
       {
          int i = 0;
          int c;
     
          while ((c = getc (fiche)) != EOF)
          {
             int j = rechercher (c, car, i);
     
             if (j == -1)
             {
                car[i] = c;
                occ[i] = 1;
                i++;
             }
             else
                occ[j]++;
          }
     
          fclose (fiche);
          n = i;
       }
       return n;
    }
     
    int main (void)
    {
       #define N 256
       unsigned occ[N] = { 0 };
       int car[N] = { 0 };
       unsigned n = remplir (occ, car);
       {
          unsigned i;
          for (i = 0; i < n; i++)
          {
             printf ("[%03d] %3d (%3u) '%c'\n", i, occ[i], (unsigned char) car[i],
                     car[i]);
          }
       }
       return 0;
    }
    (Le corbeau et le renard)
    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
     
    [000]   5 ( 77) 'M'
    [001]  36 ( 97) 'a'
    [002]   2 (238) '¯'
    [003]  34 (116) 't'
    [004]  39 (114) 'r'
    [005]  79 (101) 'e'
    [006] 117 ( 32) ' '
    [007]   5 ( 67) 'C'
    [008]  37 (111) 'o'
    [009]  15 ( 98) 'b'
    [010]  41 (117) 'u'
    [011]  16 ( 44) ','
    [012]  35 (115) 's'
    [013]  34 (110) 'n'
    [014]  16 (112) 'p'
    [015]  10 ( 99) 'c'
    [016]   5 (104) 'h'
    [017]   7 (233) 'Ú'
    [018]  18 ( 10) '
    '
    [019]   1 ( 84) 'T'
    [020]  23 (105) 'i'
    [021]   4 (102) 'f'
    [022]  11 (109) 'm'
    [023]   7 (103) 'g'
    [024]   6 ( 46) '.'
    [025]   2 ( 82) 'R'
    [026]  13 (100) 'd'
    [027]  20 (108) 'l'
    [028]   5 ( 39) '''
    [029]   3 ( 76) 'L'
    [030]   2 (224) 'Ó'
    [031]   1 (232) 'Þ'
    [032]   3 ( 58) ':'
    [033]   4 ( 34) '"'
    [034]   1 ( 72) 'H'
    [035]   3 ( 33) '!'
    [036]   3 (106) 'j'
    [037]   1 ( 81) 'Q'
    [038]   7 (118) 'v'
    [039]   2 (234) 'Û'
    [040]   4 (113) 'q'
    [041]   2 (122) 'z'
    [042]   2 ( 83) 'S'
    [043]   2 ( 86) 'V'
    [044]   1 ( 80) 'P'
    [045]   4 (120) 'x'
    [046]   1 (244) ''
    [047]   2 ( 65) 'A'
    [048]   1 ( 59) ';'
    [049]   1 ( 69) 'E'
    [050]   1 ( 73) 'I'
    [051]   1 (231) 'þ'
    [052]   1 ( 74) 'J'
    [053]   1 (121) 'y'
     
    Process returned 0 (0x0)   execution time : 0.062 s
    Press any key to continue.
    Attention, comme toujours, l'interprétation des caractères > 127 n'est pas portable.

    Il serait plus sain de faire un seul tableau de structures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct occ
    {
       int c;
       unsigned long n;
    };
    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
     
    #include <stdio.h>
     
    struct occ
    {
       int c;
       unsigned long n;
    };
     
    static int rechercher (int const c, struct occ const a_occ[],
                           unsigned const n)
    {
       unsigned i = 0;
     
       while (i < n && a_occ[i].c != c)
       {
          i++;
       }
     
       if (i < n)
          return i;
       else
          return -1;
    }
     
    static int remplir (struct occ a_occ[])
    {
       int n = 0;
       FILE *fiche = fopen ("fable.txt", "r");
       if (fiche != NULL)
       {
          int c;
     
          while ((c = getc (fiche)) != EOF)
          {
             int i = rechercher (c, a_occ, n);
     
             if (i == -1)
             {
                a_occ[n].c = c;
                a_occ[n].n = 1;
                n++;
             }
             else
                a_occ[i].n++;
          }
     
          fclose (fiche);
       }
       return n;
    }
     
    int main (void)
    {
    #define N 256
       struct occ a_occ[N] = { {0, 0} };
     
       unsigned n = remplir (a_occ);
       {
          unsigned i;
          for (i = 0; i < n; i++)
          {
             printf ("[%03u] %3lu (%3u) '%c'\n", i, a_occ[i].n,
                     (unsigned char) a_occ[i].c, a_occ[i].c);
          }
       }
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. [script bash] Rechercher une ligne de caractères dans un fichier
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 09/09/2010, 11h42
  2. recherche d'une chaine caractère dans un fichier
    Par maitre.dohko dans le forum VBScript
    Réponses: 6
    Dernier message: 21/04/2010, 12h13
  3. Réponses: 2
    Dernier message: 17/01/2010, 01h01
  4. rechercher une chaine de caractère dans un fichier
    Par 3FHFEB dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2006, 11h13
  5. Réponses: 9
    Dernier message: 07/09/2006, 13h47

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