Bonjour,

Je suis en train de développer pour moi un petit programme de gestion de tennis de table (pour compter les points). Je sais qu'il en existe déjà beaucoup mais j'ai trouvé surtout cette idée pour m'exercer, et c'est plutôt intéressant de relier mes deux passions ^^.

Bref, j'ai commencé à faire quelques petits tests voir si j'ai la capacité de faire tout ce que je souhaite, mais je bloque sur un petit problème. "Juste pour tester", j'ai créer un fichier binaire :

ofstream sortieFichierJoueurs ("informations.dat", ios::binary);

puis je l'ouvre en sortie et en entrée

fstream sortieEntreeFichierJoueurs ("informations.dat", ios::in | ios::out);

Puis j'ai créé à l'aide d'une structure deux joueurs (la structure contient deux strings, le nom et prénom, et deux double, un nommé pointsMensuels et un pointsCours), joueur1 et joueur2 et je leur ait donné quelques informations fictives, puis j'ai écrit le tout dans le fichier :

Joueur joueur1 = {"Tic", "Tac", 1150.0, 785.0};
sortieEntreeFichierJoueurs.write (reinterpret_cast <const char *> (&joueur1),
sizeof (Joueur));

Joueur joueur2 = {"Toc", "Tic", 720.0, 745.0};
sortieEntreeFichierJoueurs.write (reinterpret_cast <const char *> (&joueur2),
sizeof (Joueur));

Jusque là pas de problème. Puis j'appelle la fonction afficherListe qui prend comme argument une référence à ce fameux fichier, et j'affiche le tout :

void afficherListe (fstream & fichierLire)
{
Joueur temp;

system ("cls");
cout << "Les joueurs possedant une fiche sont :" << endl << endl;

fichierLire.seekg (0); // Replace le curseur de lecture au début du fichier

fichierLire.read (reinterpret_cast <char *> (& temp),
sizeof (Joueur));

while (!fichierLire.eof())
{
cout << temp.nom << ' ' << temp.prenom << endl;
cout << "Points mensuels (base de calcul) : " << temp.pointsMensuels << endl
<< "Points en cours : " << temp.pointsCours << endl
<< "Progression : " << temp.pointsCours - temp.pointsMensuels << endl << endl
<< "--------------" << endl << endl;

fichierLire.read (reinterpret_cast <char *> (& temp),
sizeof (Joueur));
}

cout << endl << endl;

system ("PAUSE");
}
Tout ça marche parfaitement bien, ça s'affiche pile comme je veux, c'est parfait. Le seul truc, c'est que quand je reviens dans un autre menu et que je veux réafficher une seconde fois la liste des joueurs, ben c'est tout vide, tout blanc... Puis j'ai pensé à l'eof qu'il fallait réinitialiser, j'ai donc rajouter en dessous des derniers endl un fichierLire.clear(), mais le problème, c'est qu'au lieu qu'il y n'y ait aucun nom, ça plante complétement, ça sonne,...

Je mets le code en entier en petit (il est pas complet hein, et il y a des choses qui ne devraient pas être ou elles sont, c'est juste pour tester rapidement) :

#include <iostream>
using std::cout;
using std::cerr;
using std::cin;
using std::ios;
using std::endl;

#include <string>
using std::string;

#include <fstream>
using std::ofstream;
using std::ifstream;
using std::fstream;

struct Joueur // Défini la structure Joueur
{
string nom; // Le nom de famille du joueur
string prenom; // Le prenom du joueur
double pointsMensuels; // Les points mensuels du joueur
double pointsCours; // Les points en cour
};

int menuPrincipal ();
void gestionJoueurs (fstream &);
void ajouterVictoire (fstream &);
void ajouterDefaite (fstream &);
void cloturerMois (fstream &);

int main()
{
// Créé l'objet sortieFichierJoueurs comme fichier binaire
ofstream sortieFichierJoueurs ("informations.dat", ios::binary);

if (!sortieFichierJoueurs) // Teste l'ouverture du fichier
{
cerr << "Ouverture du fichier impossible.";
exit (1);
}

// Ouvre le fichier en entrée et en sortie
fstream sortieEntreeFichierJoueurs ("informations.dat", ios::in | ios::out);

int choix; // Contient le choix de l'utilisateur
void (* fonction [4]) (fstream &) = {gestionJoueurs, ajouterVictoire, ajouterDefaite,
cloturerMois};

Joueur joueur1 = {"tc", "tn", 650.0, 642.0};
sortieEntreeFichierJoueurs.write (reinterpret_cast <const char *> (&joueur1),
sizeof (Joueur));

Joueur joueur2 = {"rf", "fd", 720.0, 745.0};
sortieEntreeFichierJoueurs.write (reinterpret_cast <const char *> (&joueur2),
sizeof (Joueur));

while ((choix = menuPrincipal ()) != 5)
{
(* fonction [choix - 1]) (sortieEntreeFichierJoueurs); // Appelle la fonction correspondante
// à l'aide des pointeurs de
// fonctions
}

system("PAUSE");
return 0;
}

// Fonction gestionJoueurs : permet de voir la liste des joueurs, d'ajouter un joueur, de
// supprimer un joueur et enfin de changer le joueur actif.
void gestionJoueurs (fstream & fichierJoueurs)
{
// Prototypes des fonctions. Ainsi, elles ne peuvent être utilisées par d'autres
// fonctions du programme, mais seulement par gestionJoueurs ()
void afficherListe (fstream &);
//void supprimerJoueur (ofstream &);
//void ajouterJoueur (ofstream &);

int choix;

do
{
system ("cls");
cout << "1 - Voir la liste des joueurs"
<< "\n2 - Supprimer un joueur"
<< "\n3 - Ajouter un joueur"
<< "\n4 - Changer le joueur actif"
<< "\n5 - Revenir au menu precedent"
<< "\nVotre choix : ";
cin >> choix;
} while (choix < 1 || choix > 5);

switch (choix) // Introduit un switch
{
case 1:
afficherListe (fichierJoueurs);
break;
case 2:
//supprimerJoueur ();
break;
case 3:
//ajouterJoueur ();
break;
case 4:
break;
case 5:
return;
default:
cerr << "Erreur.";
exit (1);
}
}

void afficherListe (fstream & fichierLire)
{
Joueur temp;

system ("cls");
cout << "Les joueurs possedant une fiche sont :" << endl << endl;

fichierLire.seekg (0); // Replace le curseur de lecture au début du fichier

fichierLire.read (reinterpret_cast <char *> (& temp),
sizeof (Joueur));

while (!fichierLire.eof())
{
cout << temp.nom << ' ' << temp.prenom << endl;
cout << "Points mensuels (base de calcul) : " << temp.pointsMensuels << endl
<< "Points en cours : " << temp.pointsCours << endl
<< "Progression : " << temp.pointsCours - temp.pointsMensuels << endl << endl
<< "--------------" << endl << endl;

fichierLire.read (reinterpret_cast <char *> (& temp),
sizeof (Joueur));
}

cout << endl << endl;

system ("PAUSE");
}

void ajouterVictoire (fstream & fichierJoueurs)
{
cout << "Hello.";
}

void ajouterDefaite (fstream & fichierJoueurs)
{
cout << "Hello.";
}

void cloturerMois (fstream & fichierJoueurs)
{
cout << "Hello.";
}

int menuPrincipal ()
{
int rubrique;

do
{
system ("cls"); // Vide l'affichage

cout << "1 - Gestion des joueurs"
<< "\n2 - Ajouter une victoire"
<< "\n3 - Ajouter une defaite"
<< "\n4 - Cloturer le mois"
<< "\n5 - Quitter"
<< "\nVotre choix : ";
cin >> rubrique;
} while (rubrique < 1 || rubrique > 5); // Vérifie le choix de l'utilisateur

return rubrique; // Retourne le choix;
}
Concernant le clear, j'ai essayé de l'ajouter à plusieurs endroits mais toujours le même résultat.