Comparaison de chaine de caracteres

romainbisson Messages postés 88 Date d'inscription jeudi 25 octobre 2007 Statut Membre Dernière intervention 9 septembre 2014 - 1 avril 2008 à 16:34
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 2 avril 2008 à 00:01
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

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
1 avril 2008 à 17:08
Bonjour.

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

Cdt
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
1 avril 2008 à 17:14
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
0
romainbisson Messages postés 88 Date d'inscription jeudi 25 octobre 2007 Statut Membre Dernière intervention 9 septembre 2014
1 avril 2008 à 18:56
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
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
1 avril 2008 à 19:08
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
romainbisson Messages postés 88 Date d'inscription jeudi 25 octobre 2007 Statut Membre Dernière intervention 9 septembre 2014
1 avril 2008 à 19:25
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
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
1 avril 2008 à 20:24
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
0
romainbisson Messages postés 88 Date d'inscription jeudi 25 octobre 2007 Statut Membre Dernière intervention 9 septembre 2014
1 avril 2008 à 20:30
merci c'est vraiment sympa
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
1 avril 2008 à 20:35
Pas de quoi ! Il faudrait veiller à ne pas saturer le tableau des adresses !

Jean-François
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 avril 2008 à 22:31
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++ (@++)<!--
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
1 avril 2008 à 22:42
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
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 avril 2008 à 23:03
Pourquoi le traiter depuis a fin ?

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

Jean-François
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 avril 2008 à 00:01
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++ (@++)<!--
0
Rejoignez-nous