Rechercher une chaîne de caractère quelconque dans un fichier quelconque

Soyez le premier à donner votre avis sur cette source.

Vue 8 553 fois - Téléchargée 362 fois

Description

Cette source sert à trouver une chaîne de caractères donnée dans un fichier quelconque, et indique sa position à chaque fois que celle-ci apparaît dans ce dernier. Elle peut être utile pour des personnes travaillant sur des fichiers et est, en plus, largement commentée.

Source / Exemple :


// Fichiers d'en-tête //
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>

// Définition du flux d'entrées-sorties utilisé pour le fichier sur lequel on travaille //
fstream stream("C:\\read.txt", ios::in|ios::out);
// Définition des variables utilisées //
char quit;
int pos=0;
char donnees[256][500];
int recurmot[1000];

// Cette fonction sert à déterminer la position prise par une chaîne de //
// caractère donné dans un fichier quelconque, chaque fois que celle-ci apparaît. //
bool verif( const char* mot) {
  int ligne=0, rep=0;
  bool etat=false;
  // Les instructions présentes dans la boucle ci-dessous se réalisent tant que //
  // le premier caractère de la ligne du fichier n'est pas nul //
  while (donnees[0][ligne]!=NULL) {
   int indice=0;
  // Idem mais pour le dernier caractère d'une ligne quelconque //
   while (donnees[indice][ligne]!=NULL) {
       int compte= 0; int taille=0;
       // Mise en place d'un compteur : la boucle fonctionne tant que le nombre //
       // total de caractères inclus dans la chaîne de caractères définie auparavant  //
       // n'est pas atteint //
       while(compte!=strlen(mot)) {
        // Eviter les erreurs dues à la présence du caractère nul  //
         if (donnees[indice+compte][ligne]!=NULL) {
          // Si les caractères du fichier et de la chaîne recherchée sont identiques //
          if (donnees[indice+compte][ligne]==mot[compte]) taille++;
             }
          compte++;
         }
      // Si la chaîne de caractères recherchée est trouvée dans le fichier : //
      //  - Renvoyer la valeur "true"                                        //
      //  - Enregistrer les différentes positions de la chaîne de caractères //
      if (taille==strlen(mot)) {
        etat=true;
        recurmot[rep++]=ligne;
        recurmot[rep++]=indice;
           }
        indice++;
        }
      ligne++;
     }
   return etat;
  }
// Fonction "main" -> Fonction principale //
int main(void) {
 int k=0;
 bool test;
 // Tant que la fonction get() ne retourne pas l'élément EOF (End Of File)  //                                    //
 while (stream.get()!=EOF) {
 // Changer la position du pointeur sur le flux d'entrée-sortie du fichier //
 stream.seekg(pos);
 char *lecture = new char[256];
 // Mettre les caractères de la ligne lue dans la chaîne de caractères "lecture" //
 // Délimitation par défaut de la fonction getline() : le caractère '\n'         //
 stream.getline(lecture, 256);
 int i=0;
 // Remplir la double matrice de caractères "données" avec sa consoeur "lecture" //
 while(lecture[i]!=NULL) {
 donnees[i][k]=lecture[i];
 i++; pos++;
     }
 // Affecter le caractère '\n' à la fin de "données"  //
 donnees[i++][k]='\n';
 k++; pos++;
 // Vider la matrice "lecture" et libérer ainsi de l'espace en mémoire //
 delete[] lecture;
  }
 // Afficher "donnees" à l'écran //
 k=0;
while(donnees[0][k]!=NULL)  {
 int i=0;
 while(donnees[i][k]!=NULL) {
   cout<<donnees[i][k];
    i++;
   }
  k++;
 }
 cout<<endl;
 // Définir la chaîne de caractères recherchée //
 const char* inter = "rep";
 int nb = strlen(inter);
 // Appel à la fonction "test" //
 test = verif(inter);
 if (test) cout<<"Les positions de la chaine de caracteres (x, y) dans le fichier sont : "<<endl;
 for(int i=0; i<1000; i++) {
 // Ne pas afficher de caractères nuls sinon risques d'erreurs //
 if (!((recurmot[i]==NULL)&&(recurmot[i+1]==NULL))) {
  cout<<recurmot[i]<<"  ";
      }
    }
  cout<<endl;
  // Afficher la chaîne de caractères juste dessous sa position respective dans le fichier //
  int xdonnees, ydonnees;
  int i=0;
  while(!((recurmot[i]==NULL)&&(recurmot[i+1]==NULL))) {
  ydonnees = recurmot[i];
  xdonnees = recurmot[i+1];
  for(int j=0; j<nb; j++) {
  cout<<donnees[xdonnees][ydonnees];
  xdonnees++;
     }
  // Eliminer les chaînes de caractères trouvées de "données" //
  while(donnees[xdonnees][ydonnees]!=NULL) {
  donnees[xdonnees-nb][ydonnees] = donnees[xdonnees][ydonnees];
  xdonnees++;
    }
  // Remplir le reliquat restant de "donnees" avec le caractère nul //
  xdonnees-=nb;
  for(int j=0; j<nb; j++) {
  donnees[xdonnees][ydonnees]=NULL;
  xdonnees++;
     }
  cout<<"   ";
  i+=2;
    }
  cout<<endl;
  k=0;
 // Afficher ensuite le résultat obtenu //
 while(donnees[0][k]!=NULL)  {
 int i=0;
 while(donnees[i][k]!=NULL) {
   cout<<donnees[i][k];
    i++;
   }
  k++;
 }
 cout<<endl;
 // Quitter le programme en appuyant sur la touche 'q' //
 while (quit!='q') cin>>quit;
 stream.close();
 }

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_stan72
Messages postés
1
Date d'inscription
dimanche 17 décembre 2006
Statut
Membre
Dernière intervention
6 août 2008
-
salut,

il suffit juste de rajouter "using namespace std;" (pour VC++ en tout cas)
avant les variables globales

mapinfo
Messages postés
8
Date d'inscription
mercredi 10 janvier 2007
Statut
Membre
Dernière intervention
3 janvier 2008
-
Bsr, ton prog sous Code::Blocks ne foonctione pas 10 erreus et 22 warnings
GrandMother
Messages postés
5
Date d'inscription
samedi 23 novembre 2002
Statut
Membre
Dernière intervention
30 juin 2003
-
Mon programme se compile parfaitement avec Dev-C++. Par contre, lorsque j'ai essayé de le faire avec Visual C++, c'est vrai qu'il affiche qu'il y a 3 erreurs. Par contre, je n'ai toujours pas trouver pourquoi mais je le saurai. Il n'y a pas de raison que cela marche avec un compilateur et pas avec un autre.
rudyl
Messages postés
2
Date d'inscription
dimanche 9 mars 2003
Statut
Membre
Dernière intervention
23 mai 2003
-
ecoute ton prog sous visual c ne marche pas 3 erreur

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (GrandMother)