Bonjour,

J'ai commencé la programmation il y a deux mois et j'ai un projet à réaliser. Je suis perdu parce que je ne dispose pas de cours à l'heure actuelle et je viens donc faire appel à votre savoir-faire pour m'aiguiller un peu svp. (Après des heures à essayer j'ai bien compris que j'y arriverai pas tout seul)

Je dois écrire un programme qui compte le nombre de lignes d'un fichier de logs (ça j'ai réussi) mais je dois aussi les compter par mois. Je m'explique. Le format des logs fait que après l'IP, il y a un champ qui correspond à la date genre [21/Feb...].
Il faudrait donc que mon programme renvoie quelque chose du genre :

Jan : 300 connexions
Feb : 200 connexions ...

Pour le moment j'ai trouvé un programme qui a l'air bien, le voici :

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <stdio.h>
#include <chaîne.h>
#include <stdlib.h>
 
/****************** Définition d'une structure ********************/
typedef struct compteMot
{
  caractère * mot;
  int nbOcc;
}CompteMot;
 
/************************ Les constantes ************************/
enum {MAXLONGUEUR = 200} ;
 
/* Le tableau où seront rangées les structures de type CompteMot */
CompteMot *tableau;
 
/* Le nombre de mots*/
entier nbMots = 0 ;
 
/* La taille du tableau contenant les mots */
int tailleTableau = 50;
 
char chercherIndice(char *, int *);
char placer(char *, int);
 
/************************ La fonction principale *******************
 Le programme : 
 - Ouvre en lecture un fichier contenant un texte, fichier dont le nom 
 est indiqué sur la ligne de commande. Dans le cas où l'utilisateur omet
 de donner un nom de fichier d'entrée sur la ligne de commande, le programme 
 demande à l'utilisateur d'indiquer le texte directement par le clavier. 
 - Trie les mots et compte le nombre d'occurrence de chaque mot 
 - Indique la liste triée des mots, un mot par ligne, avec pour chaque mot, 
 son nombre d'occurrences. Si l'utilisateur a donné sur la ligne de commande
 deux noms de fichiers, le premier pour le fichier d'entrée 
 contenant le texte, le second pour un fichier de sortie, cette liste est 
 sauvée sur le fichier de sortie. Sinon, la liste est indiquée à l'écran. */
int main(int argc, char **argv)
{
  char ligne[MAXLONGUEUR], *s, *mot;
  indice entier ;
  FICHIER *fichier;
  int je;
 
  if (argc > 1) fichier = fopen(argv[1], "r");
  autre 
    {
      fichier = stdin;
      printf("Indiquez votre texte\n");
    }
  tableau = (CompteMot *) malloc(tailleTableau * sizeof(CompteMot));
  si (tableau == NULL) 
    {
      printf("problème d'allocation\n");
      sortie(1) ;
    }
  while (fgets(ligne, MAXLONGUEUR, fichier) != NULL)
    {
      s = ligne;
      while ((mot = strtok(s, " []{}\\\n{}()*/\"#.;:,\t'?!-<>&%+=")) != NULL) 
	{
	  if (!chercherIndice(mot, &indice)) placer(mot,indice);
	  else tableau[indice].nbOcc++;
	  s = NULL ;
	}
    }
  fclose(fichier);
  printf("\n");
  pour (i = 0; i < nbMots; i++)
    printf("%s : %d fois\n", tableau[i].mot, tableau[i].nbOcc); 
  renvoie 0 ;
}
 
 
/****************** La fonction chercherIndice *******************/
/*Si le mot ne figure pas :
     - la fonction indiquée, avec la variable adrIndice, l'indice ou 
     il convient que le mot se trouve
     - la fonction retourne 0
  Si la figure donnée :  
     - la fonction indiquée, avec la variable adrIndice, l'indice ou 
     le mot figure
     - la fonction retourne 1*/
char chercherIndice(char *mot, int *adrIndice)
{
  int gauche = 0, droite = nbMots - 1;
  int milieu;
  int comparer ;
 
  tandis que (gauche <= droite)
    {
      milieu = (gauche + droite) / 2;
      compare = strcmp(mot, tableau[milieu].mot);
      si (comparer < 0) droite = milieu - 1;
      sinon si (comparer > 0) gauche = milieu + 1;
      autre 
	{
	  *adrIndice = milieu;
	  retour 1 ;
	}
    }
  *adrIndice = gauche;
  renvoie 0 ;
}
 
/****************** La fonction placer ******************/
/*Decale vers la gauche les mots qui se trouvent
  a des indices aux moins egaux a "indice" et met le mot "mot" 
  a l'indice "indice" dans le tableau.
  ATTENTION : il faut allouer de la mémoire pour y mettre le nouveau
  mot par une copie */
char placer(char *mot, int indice)
{
  int je;
  char *leMot; 
 
  leMot = (char *) malloc((strlen(mot) + 1)*sizeof(char));
  si (leMot == NULL) 
    {
      printf("problème d'allocation\n");
      sortie(1) ;
    }
  strcpy(leMot, mot); 
  if (nbMots == tailleTableau) 
    {    
      printf("Le tableau est plein, nous reallouons\n");
      tailleTableau += 50;
      tableau = (CompteMot *) realloc(tableau,
				      tailleTableau * sizeof(CompteMot));
      si (tableau == NULL) 
	{
	  printf("problème d'allocation\n");
	  sortie(1) ;
	}
    }
  pour (i = nbMots; i > indice; i--) tableau[i] = tableau[i - 1] ;
  tableau[indice].mot = leMot;
  tableau[indice].nbOcc = 1 ;
  nbMots++ ;
  retour 1 ;
}
Mais je dois être obligé de préciser sur ma ligne de commande la direction vers le fichier log et je n'ai pas réussi à faire en sorte que la redirection fonctionne. Plus problématique encore, je suis obligé de faire grep "nom du mois" pour ne pas avoir l'affichage pour chaque mot... mais j'ai aucune idée de comment retranscrire la commande grep en C.

Voilà si vous pouviez m'aider, ça serait super.