begin process at 2008 07 20 23:18:26
1 213 497 membres
398 nouveaux aujourd'hui
14 167 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : comparaison de chaine de caracteres [ Windows / System ] (romainbisson)

comparaison de chaine de caracteres le 01/04/2008 16:34:25

romainbisson

Bonjour,

je voudrais comparer une chaine de caractere avec le caractere \n, si ils sont identitiques cela m'incremente un nombre.

    char c;
    char l ='\n';  
    char nf[101];
    FILE * f;

    while((f = fopen(nf, "r")) == NULL){
    printf("\n Veuillez rentrer un nom de fichier correct avec l'extension .txt !\n");        
    printf("\n Nom du fichier : ");
    scanf("%100s", nf);
    }
   
    system("CLS");
   
     while(fgetc(f)!=EOF){
     if((!strcmp(c, l))){
                printf("youpi");
                }
                ++c;
}
}

mais sa ne marche pas correctement, j'ai besoin d'aide....


Re : comparaison de chaine de caracteres le 01/04/2008 17:08:46

laurent1024
Bonjour.

essaye plutot
int n = 0;
do {
c = fgetc (f);
if (c == '\n') n++;
} while (c != EOF);

Cdt


Re : comparaison de chaine de caracteres le 01/04/2008 17:14:40

jfrancois

Bonjour,

Si c'est pour compter un caractère particulier comme '\n' dans le fichier (l'explication est pas très claire !) voilà ce que ça peut donner :

#include <stdio.h>
void main()
{
   char car;
   char l = '\n'; 
   char nf[MAX_PATH];
   int  compteur;
   FILE *f;

   while(true)
   {
      printf("\n Veuillez rentrer un nom de fichier correct avec l'extension .txt !\n");        
      printf("\n Nom du fichier : ");
      scanf("%s",nf);
      f = fopen(nf,"r");
      if (f) break; // OK
      printf("\n *** ERREUR A L'OUVERTURE DU FICHIER ***\n");
   }
   
   system("CLS");
   compteur = 0;
   while ((car = fgetc(f)) != EOF)
   {
      if (car == l)
      {
         ++compteur;
         printf("Youpi\n");
      }
   }
   fclose(f);
   printf("compteur = %d\n",compteur);
}

Jean-François


Re : comparaison de chaine de caracteres le 01/04/2008 18:56:49

romainbisson
merci Jean-François, c'est cool.


j'ai un deuxieme probleme,

je voudrai créer des fgets

en faisant

fgets(test, 10000, f);

mais c'est fgets doivent utiliser le code que tu as fait plus haut,

   while ((car = fgetc(f)) != EOF)
   {
      if (car == l)
      {
         ++compteur;

a chaque implementation de i, il creer un nouveau fgets.

en ensuite je souhaite les afficher du dernier au premier ces fgets





Re : comparaison de chaine de caracteres le 01/04/2008 19:08:58

jfrancois

fgets() va lire le fichier ligne par ligne (fgets = f get s = file get string) y compris le saut de ligne final.

a chaque implementation de i, il creer un nouveau fgets.
en ensuite je souhaite les afficher du dernier au premier ces fgets


Là je ne comprends plus ! un petit exemple serait le bienvenu.

Jean-François


Re : comparaison de chaine de caracteres le 01/04/2008 19:25:48

romainbisson
avec le programme au dessous, on a recupere le nombre de ligne du fichier, on sait maintenant combien de fgets a creer, il faudrai que je cree une boucle qui cree autant de fgets que de nombre de ligne.


un truc comme sa,


for(i=0 ; i<nbre_de_ligne ; i++){

fgets(test[i] , 10000, f);

}

 et ensuite, je souhaite pouvoir afficher ses lignes, encore avec une bouvle de la derniere a la premier  ligne

c'est plus comprehensible

Re : comparaison de chaine de caracteres le 01/04/2008 20:24:42

jfrancois

Voilà un exemple de lecture à l'envers d'un fichier texte en passant par un tableau dans lequel on mémorise l'adresse de chaque ligne dans le fichier lors d'une première lecture du fichier. Puis, lors de la seconde lecture du fichier, on se positionne sur le début de chaque ligne pour la lire mais en commençant par la dernière ligne et en remontant vers la première ligne.

#include <stdio.h>
#include <time.h>
void main()
{
   char nom_fichier[MAX_PATH];
   char buffer[1000];
   long adresse[10000];
   int  compteur;
   FILE *pf;

   // --- Saisir/ouvrir le fichier
   while(true)
   {
      printf("\nVeuillez saisir un nom de fichier correct avec l'extension .txt !\n");        
      printf("\nNom du fichier : ");
      scanf("%s",nom_fichier);
      pf = fopen(nom_fichier,"r");
      if (pf) break;
      printf("\n*** ERREUR A L'OUVERTURE DU FICHIER ***\n");
   }
   
   // --- Remplir le tableau des adresses de début de ligne dans le fichier
   compteur = 0;
   adresse[compteur++] = 0; // 1ère ligne
   while (fgets(buffer,sizeof(buffer),pf))
      adresse[compteur++] = ftell(pf);
   --compteur; // supprimer la dernière ligne = EOF

   // --- Parcourir le fichier de la fin vers le début
   printf("compteur = %d\n",compteur);
   for (int i=compteur-1 ; i>=0 ; --i)
   {
      fseek(pf,adresse[i],SEEK_SET);   // positionnement
      fgets(buffer,sizeof(buffer),pf); // lecture
      printf("%03d : %s",i,buffer);    // visu
   }

   // --- Fermer le fichier
   fclose(pf);
}

Jean-François


Re : comparaison de chaine de caracteres le 01/04/2008 20:30:23

romainbisson
merci c'est vraiment sympa

Re : comparaison de chaine de caracteres le 01/04/2008 20:35:32

jfrancois
Pas de quoi ! Il faudrait veiller à ne pas saturer le tableau des adresses !

Jean-François


Re : comparaison de chaine de caracteres le 01/04/2008 22:31:08

SAKingdom
Membre Club
On pourrait pas à la place lire par gros bloc (plusieur ko en utilisant fread) puis parcourir ce buffer ?
Exemple:

char tab[1024];
int i, count = 1;

while((i = fread(tab, 1, sizeof(tab)-1, f))) {
    char *c = tab;
    *(c+i) = 0;

    do
         if(*c++ == '\n') count++;
    while(*c);
}

Ce serait, dans tout les cas, bien plus rapide qu'une lecture "ligne par ligne" ou pire : "caractère par caractère".

C++ (@++)



[Page 1 Page 2]
Classé sous : chaine, printf, comparaison, char, nf

Participer à cet échange

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS