begin process at 2010 02 10 06:29:26
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

Fichier & Disque

 > 

Comparer 2 fichiers textes rapidement


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Comparer 2 fichiers textes rapidement

lundi 1 décembre 2008 à 14:30:37 | Comparer 2 fichiers textes rapidement

chtitpierre78

Bonjour,

Suite à un premier poste, dont le titre ne correspond pas du tout a ma demande, je re-poste ici, en espérant trouver  solution à mon problème. (Je n'ai pas reussi à trouver comment supprimer mon ancien post ... )

Je développe actuellement un outil en C++ (VisualC++) qui me permet de comparer 2 fichiers textes (.txt) d'environ 4Mo chacun (soit environ 60000 lignes de textes), le tout sous Windows. Le premier fichier texte liste la totalité des fichiers de mon DD, avec leurs tailles, leur date d'écriture et leurs chemin complet, tout ceci à un instant N. Le second fichier, liste exactement la même chose, à un instant N+1.
Les fichiers sont de la forme :

c:\monchemin\mondossier\monssdossier\monfichier.extension;taille;datedecriture
c:\monchemin\mondossier1\monssdossier1\monfichier1.extension;taille;datedecriture
c:\monchemin\mondossier1\monssdossier2\monfichier2.extension;taille;datedecriture
...

Jusque la, ca va, le listing est très rapide, et très efficace. Le problème qui se pose maintenant est le suivant :
La comparaison de mes 2 fichiers est très très lente. Je vous proposes rapidement mon algo de comparaison :

Lecture ligne 1 du fichier 2
Comparaison de la ligne 1 avec toutes les lignes du fichier 1
Si on ne trouve pas de ligne identique, on écrit cette ligne dans un fichier texte de sortie.

Lecture ligne 2 du fichier 2
Comparaison de la ligne 2 avec toutes les lignes du fichier 1
Si on ne trouve pas de ligne identique, on écrit cette ligne dans un fichier texte de sortie.

Et je continu comme ça en incrémentant le numéro de ligne du fichier 2.


Donc je compare chaque ligne de mon fichier 2, avec toutes les lignes de mon fichier 1.
Je comprend que ca prenne du temps, mais je dois absolument remédier à ça.

Voila mon code :

**************************************************************

void exclude (char *f1, char *f2)
{
    ifstream fichier2("2.txt");
    FILE *res;
    string ligne1;
    string ligne2;
    int cpt=0;
    bool test;

    res=fopen("res.txt","w");
    fprintf(res,"DIFFERENCES :\n\n");

    while(getline(fichier2,ligne2))
    {
        cout <<"\b\b\b\r" <<cpt++;
        test = true;
        ifstream fichier1("1.txt");

        while(getline(fichier1,ligne1))
        { 
            if(ligne2==ligne1)
            {
                test=true;
                break;
            }
            else
            {
                test=false;
            }
        }
        if(test==false)
        {
            fprintf(res,"%s\n",ligne2.c_str());
        }
    }
    fclose(res);
}

**************************************************************

Donc voila, je me tourne vers vous, afin de savoir si il n'existe pas un moyen plus rapide de comparer ces fichiers textes. Pour information, je tourne sous un gros PC, plutôt bien équipé et d'après mes calculs je suis a une moyenne d'analyse de 300 lignes analysées / minutes.

J'ai l'impression de mal m'y prendre, car en effet, je suis souvent confronté a un problème de lenteur, qui est, j'en suis certain, du a ma manière de codé. Avez vous des conseils a me donner a propos de rapidité d'exécution d'un programme ?

Cordialement

K. Pierre

lundi 1 décembre 2008 à 15:13:38 | Re : Comparer 2 fichiers textes rapidement

fregolo52

Membre Club
Réponse acceptée !
Salut,

Ca ne va peut-etre pas t'aider, mais j'ai utilisé SVN sous Windows avec l'interface Tortoisesvn. Dans cette appli il y un un comparateur de fichier.
Je ne connais pas les perfs de ce soft pour des fichiers aussi gros que les tiens.

C'est open source avec le code dispo sur ce lien :
http://tortoisesvn.tigris.org/svn/tortoisesvn/trunk/src/TortoiseIDiff/
login : guest
password : vide
lundi 1 décembre 2008 à 15:22:40 | Re : Comparer 2 fichiers textes rapidement

BruNews

Administrateur CodeS-SourceS
Mais alors pourquoi on se décarcasse à répondre et vous faire des exemples si vous n'essayez même pas de vous en inspirer ???

1) Reprendre la partie indexation de mon exemple en ayant direct fait CloseHandle() sur le fichier source.
2) On ne crée pas de fichier 2 pour le comparer ensuite, totalement improductif.
Dans la récurrence FindextFile() du balayage volume, tu formes la chaine (NON string mais char[]) et tu compares avec l'indexation des lignes de source, seulement si ne s'y trouve pas tu insères dans fichier 2.

Quand on veut des perfs on code, exit les ifstream, string, fprintf et autres daubes de ce genre.

ciao...
BruNews, MVP VC++
lundi 1 décembre 2008 à 17:07:10 | Re : Comparer 2 fichiers textes rapidement

jeffy131

quel intérêt de comparer ligne à ligne ?!
il suffit de faire un chksm avec l'api Win32 et c'est immédiat.
lundi 1 décembre 2008 à 18:43:35 | Re : Comparer 2 fichiers textes rapidement

chtitpierre78

L'interet de le faire ligne par ligne, c'est que je souhaite obtenir en sortie une liste des elements qui differents d'un fichier à l'autre. Il ne s'agit pas simplement de savoir si ces fichiers sont differents, je veut savoir en quoi ils le sont.

En fait, mon objectif final est de lister les fichiers qui ont ete modifiés sur mon disque dur, entre un moment N et un momenr N+1. Et ceci, sans avoir un ReadChangesDirectory machin chose qui tourne 24h/24h en deamon....

BruNews > Je me suis plongé dans tes sources de comparaison de fichiers, afin de bidouiller et d'obtenir ce que je souhaite. Malheuresement, tout ca me prend un temps fou du fait que ton code est vraiment "tassé" et trés trés peu commenté. Je trouve ca malheureux, surtout en sachant que les gens qui trainent sur CPPFrance ne sont pas forcement des experts. Un code comme le tien pourrait effrayer plus d'un debutant ... Neanmoins, il faut admettre que  ton programme est ultra efficace/leger/rapide.

Cordialement
K.Pierre

lundi 1 décembre 2008 à 20:51:10 | Re : Comparer 2 fichiers textes rapidement

BruNews

Administrateur CodeS-SourceS
Faut donc pas hésiter à poser des questions en bas de la source, voila la bonne attitude. J'ai commencé à t'aider, je vais continuer.

vret = 2; // ERREUR SYSTEM
ReadFile(hfl, pbuf, n, &rw, 0);
CloseHandle(hfl); // FICHIER SOURCE FERME ILLICO
if(n != rw) goto relBUF;
....
....

Fichier1 étant fermé, enlever cette commande qui était plus bas dans le code original.
Tout le reste jusque:
n++;
nextLINE:
  if(!*d) goto goINFILE;
  d++;
  if(*d) goto fromBUF;
goINFILE:
doit rester, c'est l'indexation.
A ce point tu crées ton fichier 2 par CreateFile(...).
Comme dit plus haut, dans la récurrence FindNextFile(), tu crées tes chaines et tu compares comme dans source originale par:
  for(i = 0; i < n; i++) {
    if(plgn[n].len == LenDeTaChaine) {
      if(memcmp(plgn[i].pbts, TaChaine, LenDeTaChaine) == 0) goto prochainFICHIER;
    }
  }
WriteFile(hfl2, ....);
prochainFICHIER:
If(FindNextFile(....)) BOUCLAGE SUR VOPLUME;

CloseHandle(hfl2);

Suite en bas de la source si autres questions.

ciao...
BruNews, MVP VC++
jeudi 4 décembre 2008 à 14:00:14 | Re : Comparer 2 fichiers textes rapidement

chtitpierre78

Merci encore BruNews.
Mon problème n'est pas encore  totalement résolu, mais dés que j'aurai plus de temps, je me relancerai dedans.

Cordialement
K.Pierre


Cette discussion est classée dans : fichier, ligne, fichiers, res, textes


Répondre à ce message

Sujets en rapport avec ce message

Chercher un string dans un fichier texte ? [ par chtitpierre78 ] Bonjour,Je développe actuellement un outils en C++ (VisualC++) qui me permet de comparer 2 fichiers textes (.txt) d'environ 4Mo chacun (soit environ 6 fichiers en C [ par boualiasma ] Salut, 1) Dans mon travail, j'utilise des fichiers. je crée un fichier "essai.txt" pour le remplir fp = fopen("essai.txt","w"); // je fais des tra Tableau multidimensionel et fichiers [ par AngeloVivaldi ] slt à tous.Voila, je voudrai mettre dans un tableau multidimensionel chaque ligne d'un fichier, puis modifier une ligne du tableau pour le réécrire da Fichiers res [ par guiguikun ] Comment faire pour accéder à un fichier zip ou exe dans un fichier resource ?J'aimerais "packer" un fichier zip dans mon executable, mais comment puis conversion de fichiers [ par sergio18 ] salutJe fais un projet où je dois faire une conversion du fichier.POur cela le prof qui me suit m'a demandé d'effectuer ds un premier temps une lectur probleme de fichiers [ par sergio18 ] Bonjourj'ai un soucis pour recuperer une chaine de caractère.voici le code:Class Fichier{Lire();}Fichier::Fichier(){FILE *fichier;fichier=fopen(nomfic Ouverture fichier voumineux.... [ par Clonk ] Bonjour,J'ai une appli en C++ ou je dois ouvrir plusieurs fichiers texte qui peuvent faire plusieurs mégas (jusqu'à 5megs pour le moment...)Je dois le gestion de fichiers en C [ par selmaensi ] bonjour,je voudrais savoir comment faire une modification directe sur un fichier enC (le fichier est un bloc note;document texte) qui contient des enr manipulation des fichiers avec c++ [ par zing_tun ] Salut , c Anis de tunis ,en ce moment je suis en stage et je suis charger de developper un outil de synchronisation entre de base de donnees .le conte ofstream et écriture dans un fichier texte [ par bobybx ] Bonjour,J'ai une question peut-être bête mais je suis bloqué :J'ai un fichier texte avec 3 lignesligne 1ligne 2ligne 3Le contenu de ces lignes varient


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales