IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Soucis de récupération de ligne


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 41
    Par défaut Soucis de récupération de ligne
    Bonjour,

    Bonjour à toutes et a tous.

    Voilà mon soucis:

    J'ai codé un programme qui a pour but d'ouvrir deux fichiers et de lire leur contenu.
    Une fois lu, il compare le contenu des deux fichiers et renvois les lignes présentes dans le fichier 1 mais pas dans le fichier 2 et vice versa.

    Mon problème est qu'après avoir lu et affiché les fichier 1 et 2, il les relit et affiche la dernière ligne mais sans la première partie de la ligne.

    Voici le resultat de la lecture des fichiers, après l'éxécution du programme:
    http://www.casimages.com/img.php?i=0...2025747507.jpg


    Voici mon code; j'ai essayé de faire des commentaires aussi précis que possible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
     
    // 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>
    #include <conio.h>
     
    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 ( fichier1L.eof( ) == false )
    	{
    		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 ( fichier2L.eof( ) == false )
    	{
    		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 << endl;
     
     
    	fichier1L.close();
    	fichier2L.close();	/**************************/
    	fichier1E.close();	/* fermeture des fichiers */	
    	fichier2E.close();	/**************************/
     
    	cout << endl << "Appuyer sur une touche" << endl;
    	getch( );
     
    	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 < 6; ++i )
    	{
    		getline( fichier, variable.col[i], ';' );
    	}
    	getline( fichier, variable.col[6], ';' );
    	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];
    	}
    	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;
    }



    J'espere que vous comprendrez ce que je veux dire. N'hésitez pas s'il y a des soucis de compréhension.
    Merci d'avance de votre aide.

    Kira

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut, je n'ai pas la réponse à ta question, mais ceci dit, je trouve que ton algorithme est un peu compliqué. Pourquoi ne fais-tu pas ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    1) ouverture en lecture des 2 fichiers
    2) ouverture en écriture du fichier qui contiendra les lignes différentes
    3) lecture de la 1e ligne du 1e fichier, stockage du résultat dans la string str1
      3.1) lecture de la 1e ligne du 2e fichier, stockage du résultat dans la string str2
      3.2) si str1 != str2 écrire str1 dans le fichier de sortie (cf étape 2)
      3.3) passer à la 2e ligne du fichier 1 et retourner à l'étape 3.1) (mais pour la 2e ligne)
     
    Il faudra s'assurer que les 2 fichiers d'inputs ont le même nombre de lignes...
    tu mets tout ceci dans une fonction qui prend en input, file1, file2 et fileout (le fichier de sortie). maintenant, si tu veux comparer file2 à file1 (et non plus file1 à file2), tu appelles cette même fct en permutant file1 et file2. Ca fera moins de ligne de code.

    Je ne pense pas que tu aies besoin de getline avec son 3e argument. Pourquoi ne stockes-tu pas toute la ligne (donc getline avec seulement 2 arguments) dans une string ?

    Mais je n'ai pas répondu à ta question originelle...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 41
    Par défaut
    Bonjour et merci de vos conseils.

    En fait, je n'ai pas fait ca car les fichiers que je dois récupérer sont des fichiers excel .csv. Ils sont présenté sous formes de colonnes. Comme il n'existe pas de fonction capable de récupérer des colonnes (à ma connaissance) j'ai donc fait en sorte de récupérer chaque morceaux de lignes séparés par un ";" sous excel et de les placer dans des tableaux que je compare cette fois ci ligne par ligne.

    Je ne sais pas si c'est très claire ce que je dis :s?
    Sinon merci quand meme de ton aide, j'ai trouvé la solution à mon problème:
    D'une part dans mes deux boucles while, il fallait simplement que je test la fin de fichier ( donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ( fichier1L.eof( ) == false )
    ) et d'autre part comme chaque fichier se finit par un retour chariot, lorsque je récupérais les lignes via un getline( ), je me suis rendu compte qu'en fait la fonction comptait le retour chariot comme une nouvelle ligne qui bien sur apparaissait comme vide au debut et puis avec le contenu de la ligne précédente ensuite.
    J'ai donc fait en sorte de vérifier pour chaque ligne que l'on récupère que la première partie de cette ligne ne soit pas vide.

    Merci quand même pour ton explication
    A bientot

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ComboBox et récupération de ligne
    Par Andry dans le forum Delphi
    Réponses: 11
    Dernier message: 19/07/2006, 14h54
  2. Réponses: 10
    Dernier message: 13/03/2006, 14h30
  3. [AWK] récupération de lignes qui se suivent
    Par PtiNico dans le forum Linux
    Réponses: 2
    Dernier message: 12/04/2005, 19h44
  4. Soucis de récupération de code
    Par sheira dans le forum ASP
    Réponses: 16
    Dernier message: 06/12/2004, 11h42
  5. [PointBase][Probleme] Récupération de ligne
    Par cibouseb dans le forum Autres SGBD
    Réponses: 7
    Dernier message: 28/07/2003, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo