C++ > Comparaison

TitreComparaison
Postée le15-10-2009
Affichée809
Mini-lien
Description

Compare

EtatContient des erreurs. Contient des erreurs.
Code d'insertion
Options
Afficher les numéros de lignes  Mettre la source en plein ecran  Selectionner la source  Partager sur Facebook 
Téléchargement Telecharger en format txt  Telecharger en format pdf  Telecharger en format cpp
Plein ecran
// Comparaison fichiers.cpp*: définit le point d'entrée pour l'application console.
//

/////////////////////
/// Bibliothèques ///
/////////////////////

#include <stdafx.h>
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
#include <cassert>
#include <vector>
#include <algorithm>

using namespace std;


////////////////////////////////
/// Déclaration de Variables ///
////////////////////////////////

#define NBRE_COL 8

int compteur = 0;

///////////////////////////////////
/// Déclaration de structure(s) ///
///////////////////////////////////

typedef struct structure
{
        string col[8];
        bool structure::operator == ( const structure& cols ) const;
};


//////////////////////////////
/// Prototype de Fonctions ///
//////////////////////////////

ostream& operator << ( ostream& out, structure colonne_var );
void recup_ligne( ifstream& fichier, structure &colonne_var );
void affich_Tab( vector < structure > tableau );
int compare( vector < structure > Tab1, vector < structure > Tab2 );


///////////////////////////
/// Programme Principal ///
///////////////////////////

int _tmain(int argc, _TCHAR* argv[])
{
        /* Ouverture des fichiers en lecture */

        ifstream fichier1L( "C:\\Documents and Settings\\bastien\\Bureau\\Offres - Tables EDI Excel\\20090727-TABLES_EDI_petit.csv" );
        if( fichier1L.is_open( ) == false )
        {
                cout << "ERREUR LORS DE L'OUVERTURE DU FICHIER 20090727-TABLES_EDI_petit.csv" << endl;
                assert( false );
                return -1;
        }

        ifstream fichier2L( "C:\\Documents and Settings\\bastien\\Bureau\\Offres - Tables EDI Excel\\20090731-TABLES_EDI_petit.csv" );
        if ( fichier2L.is_open( ) == false )
        {
                cout << "ERREUR LORS DE L'OUVERTURE DU FICHIER 20090731-TABLES_EDI_petit.csv" << endl;
                assert( false );
                return -1;
        }

        /* Ouverture des fichiers en écriture */

        ofstream fichier1E( "C:\\Documents and Settings\\bastien\\Bureau\\Ecriture de 20090727-TABLES_EDI.txt" );
        if ( fichier1E.is_open( ) == false )
        {
                cout << "ERREUR LORS DE L'OUVERTURE DU FICHIER Ecriture de 20090727-TABLES_EDI.txt" << endl;
                assert( false );
                return -1;
        }

        ofstream fichier2E( "C:\\Documents and Settings\\bastien\\Bureau\\Ecriture de 20090731-TABLES_EDI.txt" );
        if ( fichier2E.is_open( ) == false )
        {
                cout << "ERREUR LORS DE L'OUVERTURE DU FICHIER Ecriture de 20090731-TABLES_EDI.txt" << endl;
                assert( false );
                return -1;
        }


        // Pour lire les lignes du fichier1L et les afficher:

        string ligne;
        structure colonne_var;                          // Création d'une variable "colonne_var" de type "Colonne_struct".
        vector < structure > MonTableau1;       // Création d'un tableau contenant n structures.

        while ( getline( fichier1L, ligne ) != 0 )
        {
                recup_ligne( fichier1L, colonne_var );  // Récupère les lignes du premier fichier
                cout << colonne_var.col[0] << "\t" << colonne_var.col[3] << endl;       // Affiche la première et 4ème colonne du premier fichier

                MonTableau1.push_back( colonne_var );   // Insère les lignes lues du premier fichier dans MonTableau1
                fichier1E << colonne_var.col[0] << "\t" << colonne_var.col[3] << endl;  // Ecrit la première et 4ème colonne de MonTableau1 dans un fichier .txt
        }

       
        // Pour lire les lignes du fichier2L et les affciher:

        string ligne1;
        vector < structure > MonTableau2;

        while ( getline( fichier2L, ligne1 ) != 0 )
        {
                recup_ligne( fichier2L, colonne_var );  // Récupère les lignes du second fichier
                cout << colonne_var.col[0] << "\t" << colonne_var.col[3] << endl;       // Récupère les lignes du second fichier

                MonTableau2.push_back( colonne_var );   // Insère les lignes lues du second fichier dans MonTableau2
                fichier2E << colonne_var.col[0] << "\t" << colonne_var.col[3] << endl;  // Ecrit la première et 4ème colonne dans un second fichier .txt
        }
       
        cout << endl << endl;

        // Affichage du tableau pour le fichier1L
        affich_Tab( MonTableau1 );

        // Affichage du tableau pour le fichier2L
        affich_Tab( MonTableau2 );
       
        cout << endl << endl;


        //COMPARAISON FICHIER 1 AU FICHIER 2
        compare( MonTableau1, MonTableau2 );
        cout << "Ligne(s) presente(s) dans le fichier 1 et non presente(s) dans le fichier 2: " << endl << compteur << " ligne(s)" << endl;
       
        cout << endl << endl;

        //COMPARAISON FICHIER 2 AU FICHIER 1
        compare( MonTableau2, MonTableau1 );
        cout << "Ligne(s) presente(s) dans le fichier 2 et non presente(s) dans le fichier 1: " << endl  << compteur << " ligne(s)"  << endl;
       
               
        fichier1L.close();
        fichier2L.close();      /**************************/
        fichier1E.close();      /* fermeture des fichiers */   
        fichier2E.close();      /**************************/

        return 0;
}


////////////////////////////////
/// Déclaration de Fonctions ///
////////////////////////////////

/* Fonction pour récupérer les lignes d'un fichier */
void recup_ligne( ifstream &fichier, structure &variable )
{
        for ( int i = 0; i < 7; ++i )
        {
                getline( fichier, variable.col[i], ';' );
        }
        getline( fichier, variable.col[7] );
}

/* Fonction pour afficher le contenu d'un tableau */
void affich_Tab( vector < structure > tableau )
{
        for ( unsigned int i = 0; i < tableau.size( ) ; ++i )
        {
                cout << tableau[i] << "\t";
        }
        cout << endl;
}      

/* Fonction pour déclarer un opérateur == */
bool structure::operator == (const structure & cols) const
{
        for ( int i = 0; i < NBRE_COL; ++i)
        {
                if ( col[i] != cols.col[i] )
                                return false;
        }
                return true;
}

/* Fonction pour déclarer un opérateur << */
ostream& operator << ( ostream& out, structure colonne_var )
{
        for ( int i = 0; i < NBRE_COL; ++i )
        {
                out << colonne_var.col[i] << " ";
        }
        out << endl;
        return out;
}

/* Fonction pour comparer le contenu des deux tableaux */
int compare( vector < structure > Tab1, vector < structure > Tab2 )
{
        compteur = 0;

        vector < structure >::iterator itCurrent1;                              // Création d'un vector de type "Colonne_struct" qui est un iterator de nom "itCurrent1".
        vector < structure >::iterator itEnd1 = Tab1.end( );    // Création d'un vector de type "Colonne_struct" qui est un iterator de nom "itEnd1" initialisé à la fin d'un tableau.

        vector < structure >::iterator itCurrent2;                              // Idem
        vector < structure >::iterator itEnd2 = Tab2.end( );    // Idem
       
        cout << endl;
       

        itCurrent1 = Tab1.begin ( );                                   
        for ( ; itCurrent1 != itEnd1; ++itCurrent1 )                            // Deux boucles for imbriquées permettent la comparaison;
        {                                                                                                                       // On compare chaque ligne du tableau1 à l'ensemble des
                bool trouve = 0;                                                                                // lignes du tableau2.                                                                 
                                                                                                                                // Pour une ligne du tableau1, on parcour l'ensemble du tableau2
                itCurrent2 = Tab2.begin ( );                                                    // Si la ligne est trouvée, on place "trouve" à true et on sort
                for ( ; itCurrent2 != itEnd2; ++itCurrent2 )                    // de la seconde boucle for.
                {                                                                                                               // Si la ligne n'est pas trouvée, "trouve" est à "false", on incrémente un compteur
                        if ( *itCurrent2 == *itCurrent1 )                                       // (qui sera chargé de renseigner par la suite le nombre de lignes absentes)
                        {                                                                                                       // et on affiche la ligne qui ne se trouve pas dans le tableau2.
                                trouve = true;                                                                  // Enfin, lorsque la comparaison est finie, on renvoi la valeur du compteur.
                                break;
                        }
                }      

                if( trouve == false )
                {
                        compteur = compteur++;
                        cout << *itCurrent1;
                }
        }
        return compteur;
}