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

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

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)