Comparaison de chaine de caracteres

Signaler
Messages postés
89
Date d'inscription
jeudi 25 octobre 2007
Statut
Membre
Dernière intervention
9 septembre 2014
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
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....

13 réponses

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
25
Bonjour.

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

Cdt
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
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
Messages postés
89
Date d'inscription
jeudi 25 octobre 2007
Statut
Membre
Dernière intervention
9 septembre 2014

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
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
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
Messages postés
89
Date d'inscription
jeudi 25 octobre 2007
Statut
Membre
Dernière intervention
9 septembre 2014

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
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
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
Messages postés
89
Date d'inscription
jeudi 25 octobre 2007
Statut
Membre
Dernière intervention
9 septembre 2014

merci c'est vraiment sympa
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Pas de quoi ! Il faudrait veiller à ne pas saturer le tableau des adresses !

Jean-François
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
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++ (@++)<!--
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Oui mais à condition de lire tout le fichier puisque'il faut l'afficher (ou le traiter) à partir de la fin.

- Récupérer la taille du fichier
- Allouer un bloc de mémoire de la taille du fichier
- Lire le fichier d'un coup dans ce bloc
- Rechercher et afficher/traiter les lignes à partir de la fin du bloc
- Désallouer le bloc

Jean-François
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Pourquoi le traiter depuis a fin ?

C++ (@++)<!--
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
C'est ce qui est demandé dans ce post !!!

Jean-François
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Ah ok je vois.

"- Récupérer la taille du fichier
- Allouer un bloc de mémoire de la taille du fichier
- Lire le fichier d'un coup dans ce bloc
- Rechercher et afficher/traiter les lignes à partir de la fin du bloc
- Désallouer le bloc"

Y'a moyen de s'arranger autrement mais ce sera, dans la plupart des cas, un vrai gaspillage de CPU.

C++ (@++)<!--