Bonjour tout le monde,

Je suis dans le désespoir le plus profond (non s'est pour rire ).

J'ai un programme en C++ qui charge un fichier txt mais qui ne l'affiche pas

Voici ma méthode d'affichage :
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
 
 
void CTabFauxFreres::Afficher()
{
	printf("voici le contenu du fichier Exemples\n\n");
 
	long n = 0;
 
	printf("la valeur de nombre est de %ld",Nombre());
 
	for (n=0; n<=Nombre();n++)
	{
		printf("%s\n",Element(n).Ligne());
	}
}
désolé pour les printf mais pour l'instant, s'est comme cela que je dois faire (d'ici un mois s'est terminé le printf !).

Je pense que laisser l'entièreté de mon code serait la façon la plus simple de résoudre ce problème.

Voici le main :

#include <BasicConsole.h>
#include "FFDD2.h"

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
void main()
{
	CTabFauxFreres FF;
 
	if(FF.Charger("exemple.txt")) FF.Afficher();
}
le header :

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
#ifndef FFDD1_H
#define FFDD1_H
 
 
#include "generique.h"
#include "chaine.h"
 
 
class CFauxFrere;
class CTabFauxFreres;
 
class CFauxFrere : public CGenerique
{
public:
	CFauxFrere(); // constructeur par défaut
	CFauxFrere(const CFauxFrere& Source); //constructeur par copie
	CFauxFrere(const char* UneLigne);
	CFauxFrere::~CFauxFrere(); //Destructeur
	CGenerique*		Cloner() const;
	const char*		Ligne() const;		//accesseur de l'objet Ligne
	bool			Ligne(const char* UneLigne);	//Modificateur de l'objet Ligne
 
 
private:
	CChaine			m_Ligne;
 
};
 
class CTabFauxFreres : public  CTableauGenerique
{
public :
 
	CTabFauxFreres(); //constructeur par défaut
	CTabFauxFreres(const CTabFauxFreres& Source);
	~CTabFauxFreres();
 
	CGenerique*	Cloner() const;
	CFauxFrere&	Element(long Indice) const;
	long		Indice(const char* UnNom) const;
	bool		Ajouter(const CFauxFrere& Modele);
	bool		Charger(const char* NomFichier);
	void		Afficher();
 
	private:
	static bool	FctnTraiterLigne(const CChargeurFichierTexte& Chargeur, void* Contexte);
	bool		TraiterLigne(const CChargeurFichierTexte& Chargeur);
 
 
 
 
 
};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#endif FFDD1_H
le cpp correspond à ce h

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
#include <BasicConsole.h>
#include "FFDD2.h"
 
///////////////////////
// Classe CFauxFrere //
///////////////////////
 
CFauxFrere::CFauxFrere() //constructeur par défaut
{
}
 
CFauxFrere::CFauxFrere(const CFauxFrere& Source) //constructeur par copie
{
 
}
 
CFauxFrere::CFauxFrere(const char* UneLigne) //constructeur spécifique
{
 
}
 
CFauxFrere::~CFauxFrere() //Destructeur
{
 
}
 
CGenerique* CFauxFrere::Cloner() const
{
	return new CFauxFrere(*this);
}
 
bool CFauxFrere::Ligne(const char* UneLigne) //Modificateur 
{
	if((strlen(UneLigne) < 1) || (UneLigne == NULL)) return false;
	return m_Ligne.Chaine(UneLigne);
 
}
 
const char* CFauxFrere::Ligne() const
{
	return m_Ligne.Chaine();
}
 
////////////////////
// CTabFauxFreres //
///////////////////
 
 
CTabFauxFreres::CTabFauxFreres()
:CTableauGenerique(CFauxFrere())
{
}
 
CTabFauxFreres::CTabFauxFreres(const CTabFauxFreres& Source)
:CTableauGenerique(Source)
{
}
 
CTabFauxFreres::~CTabFauxFreres()
{
}
 
 
CGenerique* CTabFauxFreres::Cloner() const
{
	return new CTabFauxFreres(*this);
}
 
CFauxFrere& CTabFauxFreres::Element(long Indice) const
{
	return (CFauxFrere&)CTableauGenerique::Element(Indice);
}
 
long CTabFauxFreres::Indice(const char* UneLigne) const
{
	return CTableauGenerique::Indice(CFauxFrere(UneLigne));
}
 
bool CTabFauxFreres::Charger(const char* NomFichier)
{
		CChargeurFichierTexte	Chargeur;
 
	return Chargeur.Charger(NomFichier,'\t',FctnTraiterLigne,this);
 
}
 
bool CTabFauxFreres::FctnTraiterLigne(const CChargeurFichierTexte& Chargeur, void* Contexte)
{
	return ((CTabFauxFreres*)Contexte)->TraiterLigne(Chargeur);
}
 
bool CTabFauxFreres::TraiterLigne(const CChargeurFichierTexte& Chargeur)
{
	if (Chargeur.NombreChamps() == 1) Ajouter(CFauxFrere(Chargeur.Champs(0)));
	return true;
}
 
bool CTabFauxFreres::Ajouter(const CFauxFrere& Modele)
{
	return CTableauGenerique::Ajouter(Modele);
} 
 
void CTabFauxFreres::Afficher()
{
	printf("voici le contenu du fichier Exemples\n\n");
 
	long n = 0;
 
	printf("la valeur de nombre est de %ld",Nombre());
 
	for (n=0; n<=Nombre();n++)
	{
		printf("%s\n",Element(n).Ligne());
	}
}
il y'a aussi chaine.cpp :

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
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#include <BasicConsole.h>
#include "chaine.h"
 
 
////////////////////
// Classe CChaine //
////////////////////
 
CChaine::CChaine()
:m_Chaine(NULL)
{
}
 
CChaine::CChaine(const CChaine& Source)
:m_Chaine(NULL)
{
	Chaine(Source.m_Chaine);
}
 
CChaine::CChaine(const char* UneChaine)
:m_Chaine(NULL)
{
	Chaine(UneChaine);
}
 
CChaine::~CChaine()
{
	Vider();
}
 
bool CChaine::GereUnicite() const
{
	return true;
}
 
long CChaine::NombreClesDeTri() const
{
	return 4;
}
 
CGenerique* CChaine::Cloner() const
{
	return new CChaine(*this);
}
 
bool CChaine::EstValide() const
{
	return true;
}
 
int CChaine::Comparer(const CGenerique& Autre, long TypeComparaison) const
{
	switch (TypeComparaison)
	{
	case ComparaisonPourUnicite:
		return strcmp(Chaine(),((const CChaine&)Autre).Chaine());
	case Comparaison_TriCroissantStrict:
		return strcmp(Chaine(),((const CChaine&)Autre).Chaine());
	case Comparaison_TriDecroissantStrict:
		return -strcmp(Chaine(),((const CChaine&)Autre).Chaine());
	case Comparaison_TriCroissantNonStrict:
		return stricmp(Chaine(),((const CChaine&)Autre).Chaine());
	case Comparaison_TriDecroissantNonStrict:
		return -stricmp(Chaine(),((const CChaine&)Autre).Chaine());
	}
	return 0;
}
 
void CChaine::Vider()
{
	if (m_Chaine != NULL)
	{
		free(m_Chaine);
		m_Chaine = NULL;
	}
}
 
bool CChaine::Chaine(const char* UneChaine)
{
	if (UneChaine == NULL) return false;
	void* Nouveau = realloc(m_Chaine,(strlen(UneChaine)+1)*sizeof(char));
	if (Nouveau == NULL) return false;
	m_Chaine = (char*)Nouveau;
	strcpy(m_Chaine,UneChaine);
	return true;
}
 
const char* CChaine::Chaine() const
{
	return (m_Chaine != NULL) ? m_Chaine : "";
}
 
bool CChaine::EstNull() const
{
	return (m_Chaine == NULL);
}
 
bool CChaine::EstVide() const
{
	return (m_Chaine == NULL) || (m_Chaine[0] == 0);
}
 
 
////////////////////////////
// Classe CChaineComposee //
////////////////////////////
 
CChaineComposee::CChaineComposee()
:m_NbrChamps(0),m_Champs(NULL)
{
}
 
CChaineComposee::CChaineComposee(const CChaineComposee& Source)
:CChaine(Source),m_NbrChamps(0),m_Champs(NULL)
{
	if (Source.m_NbrChamps > 0)
	{
		m_Champs = (char**)malloc(Source.m_NbrChamps*sizeof(char*));
		if (m_Champs != NULL)
		{
			m_NbrChamps = Source.m_NbrChamps;
			for (long n=0; n < Source.m_NbrChamps; n++)
			{
				long PosRel = Source.m_Champs[n] - Source.m_Champs[0];
				m_Champs[n] = ((char*)Chaine()) + PosRel;
			}
		}
	}
}
 
CChaineComposee::CChaineComposee(const char* UneChaine, char UnSeparateur)
:CChaine(UneChaine),m_NbrChamps(0),m_Champs(NULL)
{
	Decomposer(UnSeparateur);
}
 
CChaineComposee::~CChaineComposee()
{
	if (m_Champs) free(m_Champs);
}
 
bool CChaineComposee::GereUnicite() const
{
	return false;
}
 
long CChaineComposee::NombreClesDeTri() const
{
	return 0;
}
 
CGenerique* CChaineComposee::Cloner() const
{
	return new CChaineComposee(*this);
}
 
int CChaineComposee::Comparer(const CGenerique& Autre, long TypeComparaison) const
{
	return 0;
}
 
long CChaineComposee::NombreChamps() const
{
	return m_NbrChamps;
}
 
const char* CChaineComposee::Champs(long Indice) const
{
	return ( (Indice >= 0) && (Indice < m_NbrChamps) ) ? m_Champs[Indice] : "";
}
 
bool CChaineComposee::Definir(const char* UneChaine, char UnSeparateur)
{
	if (!Chaine(UneChaine)) return false;
	return Decomposer(UnSeparateur);
}
 
bool CChaineComposee::Decomposer(char UnSeparateur)
{
	m_NbrChamps = 0;
	char* Texte = (char*)Chaine();
	if (Texte == NULL) return false;
	void* Nouveau = realloc(m_Champs,1*sizeof(char*));
	if (Nouveau == NULL)
	{
		if (m_Champs)
		{
			free(m_Champs);
			m_Champs = NULL;
		}
		return false;
	}
	m_Champs = (char**)Nouveau;
	m_Champs[m_NbrChamps] = Texte;
	m_NbrChamps++;
	while (true)
	{
		char* Delimiteur = strchr(Texte,UnSeparateur);
		if (Delimiteur == NULL) return true;
		*Delimiteur = 0;
		Texte = Delimiteur + 1;
		void* Nouveau = realloc(m_Champs,(m_NbrChamps+1)*sizeof(char*));
		if (Nouveau == NULL) return false;
		m_Champs = (char**)Nouveau;
		m_Champs[m_NbrChamps] = Texte;
		m_NbrChamps++;
	}
}
 
 
//////////////////////////////////
// Classe CChargeurFichierTexte //
//////////////////////////////////
 
CChargeurFichierTexte::CChargeurFichierTexte()
{
}
 
CChargeurFichierTexte::CChargeurFichierTexte(const CChargeurFichierTexte& Source)
:CChaineComposee(Source)
{
}
 
CChargeurFichierTexte::~CChargeurFichierTexte()
{
}
 
CGenerique* CChargeurFichierTexte::Cloner() const
{
	return (CGenerique*)((void*)new CChargeurFichierTexte(*this));
}
 
bool CChargeurFichierTexte::Charger(const char* NomFichier, char UnSeparateur, bool (* FctnTraiterLigne)(const CChargeurFichierTexte&, void*), void* Contexte)
{
	const long		TailleLigne = 500;
	char			Ligne[TailleLigne+1];
	FILE*			Fichier;
 
	if ( (NomFichier == NULL) || (*NomFichier == 0) ) return false;
	Fichier = fopen(NomFichier,"rt");
	if (Fichier == NULL) return false;
	while (fgets(Ligne,TailleLigne,Fichier) != NULL)
	{
		long i = strlen(Ligne);
		if ( (i > 0) && (Ligne[i-1] == '\n') ) Ligne[i-1] = 0;
		if (Definir(Ligne,'\t'))
		{
			if (!FctnTraiterLigne(*this,Contexte))
			{
				fclose(Fichier);
				return false;
			}
		}
	}
	fclose(Fichier);
	return true;
}
et generique.cpp :

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
#include <BasicConsole.h>
#include <search.h>
#include "generique.h"
 
 
///////////////////////
// Classe CGenerique //
///////////////////////
 
CGenerique::CGenerique()
:m_Conteneur(NULL)
{
}
 
CGenerique::CGenerique(const CGenerique& Source)
:m_Conteneur(NULL)
{
}
 
CGenerique::~CGenerique()
{
}
 
bool CGenerique::GereUnicite() const
{
	return false;
}
 
long CGenerique::NombreClesDeTri() const
{
	return 0;
}
 
CGenerique* CGenerique::Cloner() const
{
	return new CGenerique(*this);
}
 
bool CGenerique::EstValide() const
{
	return true;
}
 
int CGenerique::Comparer(const CGenerique& Autre, long TypeComparaison) const
{
	return 0;
}
 
CTableauGenerique* CGenerique::Conteneur() const
{
	return m_Conteneur;
}
 
void CGenerique::DefinirConteneur(CTableauGenerique* Tableau)
{
	m_Conteneur = Tableau;
}
 
 
//////////////////////////////
// Classe CTableauGenerique //
//////////////////////////////
 
CTableauGenerique::CTableauGenerique(const CGenerique& ModelePoubelle)
:m_Poubelle(NULL),m_Nombre(0),m_Tableau(NULL),m_TypeComparaison(-1)
{
	m_Poubelle = ModelePoubelle.Cloner();
	m_Poubelle->DefinirConteneur(this);
}
 
CTableauGenerique::CTableauGenerique(const CTableauGenerique& Source)
:m_Poubelle(NULL),m_Nombre(0),m_Tableau(NULL),m_TypeComparaison(-1)
{
	m_Poubelle = Source.m_Poubelle->Cloner();
	for (long n=0; n < Source.m_Nombre; n++) Ajouter(Source.Element(n));
}
 
CTableauGenerique::~CTableauGenerique()
{
	Vider();
	delete m_Poubelle;
}
 
CGenerique* CTableauGenerique::Cloner() const
{
	return new CTableauGenerique(*this);
}
 
long CTableauGenerique::Nombre() const
{
	return m_Nombre;
}
 
CGenerique& CTableauGenerique::Element(long Indice) const
{
	return ((Indice >= 0) && (Indice < m_Nombre)) ? *(m_Tableau[Indice]) : *m_Poubelle;
}
 
long CTableauGenerique::Indice(const CGenerique& ModeleRecherche) const
{
	if ( (m_Nombre == 0) || (!m_Poubelle->GereUnicite()) || (!ModeleRecherche.EstValide()) ) return -1;
	const CGenerique* Recherche = &ModeleRecherche;
	unsigned int n = m_Nombre;
	((CTableauGenerique*)this)->m_TypeComparaison = ComparaisonPourUnicite;
	CGenerique** Trouve = (CGenerique**)_lfind(&Recherche,m_Tableau,&n,sizeof(CGenerique*),Comparer);
	((CTableauGenerique*)this)->m_TypeComparaison = -1;
	return (Trouve != NULL) ? Trouve - m_Tableau : -1;
}
 
void CTableauGenerique::Vider()
{
	if (m_Tableau != NULL)
	{
		for (long n=0; n < m_Nombre; n++) delete m_Tableau[n];
		free(m_Tableau);
		m_Tableau = NULL;
		m_Nombre = 0;
	}
}
 
bool CTableauGenerique::Ajouter(const CGenerique& ModeleAAjouter, bool RetourEnCasDeDoublon)
{
	if (!ModeleAAjouter.EstValide()) return false;
	if ( (m_Poubelle->GereUnicite()) && (Indice(ModeleAAjouter) >= 0) ) return RetourEnCasDeDoublon;
	void* Nouveau = realloc(m_Tableau,(m_Nombre+1)*sizeof(CGenerique*));
	if (Nouveau == NULL) return false;
	m_Tableau = (CGenerique**)Nouveau;
	CGenerique* AAjouter = ModeleAAjouter.Cloner();
	if (!AAjouter->EstValide())
	{
		delete AAjouter;
		return false;
	}
	m_Tableau[m_Nombre] = AAjouter;
	m_Tableau[m_Nombre]->DefinirConteneur(this);
	m_Nombre++;
	return true;
}
 
bool CTableauGenerique::Supprimer(long Indice)
{
	if ( (Indice < 0) || (Indice >= m_Nombre) ) return false;
	delete m_Tableau[Indice];
	if (Indice < (m_Nombre-1)) memmove(m_Tableau+Indice,m_Tableau+(Indice+1),(m_Nombre-1-Indice)*sizeof(CGenerique*));
	realloc(m_Tableau,(m_Nombre-1)*sizeof(CGenerique*));
	m_Nombre--;
	return true;
}
 
void CTableauGenerique::Trier(long TypeComparaison)
{
	if ( (m_Nombre >= 2) && (TypeComparaison >= 1) && (TypeComparaison <= m_Poubelle->NombreClesDeTri()) )
	{
		m_TypeComparaison = TypeComparaison;
		qsort(m_Tableau,m_Nombre,sizeof(CGenerique*),Comparer);
		m_TypeComparaison = -1;
	}
}
 
/*static*/int CTableauGenerique::Comparer(const void* p1, const void* p2)
{
	const CGenerique* o1 = *((const CGenerique**)p1);
	const CGenerique* o2 = *((const CGenerique**)p2);
	return o1->Comparer(*o2,o2->Conteneur()->m_TypeComparaison);
}
Merci d'avance pour votre aide.

beegees