Problème d'affichage a la lecture d'un fichier avec fonction fstream et stockage

cs_curite Messages postés 8 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 4 mai 2010 - 2 mai 2010 à 20:58
cs_curite Messages postés 8 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 4 mai 2010 - 4 mai 2010 à 07:49
Bonjours, j'ai créer un gestionnaire de mot de passe en c++ je vous montre le code sinon vous allez rien comprendre :p

main.cpp
#include 
#include <string>

using namespace std;

string ajoutCompte(const string& compte,const string& login,const string& mdp);//les prototypes
int afficherCompte1(int numeroCompte);
int afficherCompteTout(int lala);

int main()
{
int medp=NULL;
     int choixMenu;
     int choixCompte;
 int variablePourParametre;

     string compte;
     string login;
     string mdp;
     do
{

     cout<<"Que voulez-vous faire?: "<<endl<<endl<<"1-Voir les mots de passe"<<endl;//on affiche les choix
     cout<<"2-Ajouter un compte"<<endl<<"3-Supprimer TOUT les mots de passe";
     cout<<endl<<"4-Quitter"<<endl;
     cin>>choixMenu;
     switch (choixMenu)//le traditionnel switch
     {
         case 1:
         cout<<"-----MOTS DE PASSE ENREGISTRES-----";
         cout<<endl<<endl<<"Voici la liste des mots de passes enregistres: "<<endl<<endl;
         afficherCompteTout(variablePourParametre);//vous remarquerez , variablePourParametre ne sert a rien, mais sans sa, code block me renvoi une erreur

         cout<<endl<<endl<<"Quel mot de passe voulez vous afficher?(un nombre trop grand affichera\nle dernier): ";
         cin>>choixCompte;
        afficherCompte1(choixFonction);//pour afficher le compte choisi

         break;

         case 2:
         cout<<"-----AJOUT D'UN MOT DE PASSE-----"<<endl<<endl;
         cout<<"Donnez un nom au compte pour le reconnaitre: "<<endl;
         cin>>compte;
         cout<<"Entrez le login: "<<endl;
         cin>>login;
         cout<<"Entrez le mot de passe: "<<endl;
         cin>>mdp;
         ajoutCompte(compte,login,mdp);//pour ajouter un compte
         break;


         case 3:
         remove("dnnsmps.gmtp");//pour supprimer le fichier donc les mdp
         break;

         case 4:
         return 0;//pour fermer la console
         break;

         default:
         cout<<"Valeur rentree non correspondante";//si la personne a entrée un mauvais numéro
     }


     cout<<"Que voulez vous faire?"<<endl<<endl<<"1-Retourner au menu"<<endl<<"2-Quitter";//pour pouvoir retourner au menu
     cin >> choixMenu;
}while(choixMenu != 2);//si il veut quitter, la fonction se termine par un return et la console de ferme
        return 0;
}


fonction.cpp
#include 
#include <string>
#include <fstream>
#include <windows.h>

using namespace std;


void ajoutCompte(const string& compte,const string& login,const string& mdp)//pour ajouter un compte
{
        fstream fichier("dnnsmps.gmtp", ios::out|ios::app);//je met souvent fstream car je trouve sa plus simple
        if(fichier)
        {
               fichier << compte << std::endl;//pour ecrire dans le fichier
               fichier << login << std::endl;
               fichier << mdp << std::endl;

                fichier.close();
        }
        else//sinon erreur
        {
                cerr << "Impossible d'ouvrir le fichier !" << endl;
        }
}

void afficherCompte1(int numeroCompte)//pour afficher un compte
{
fstream fichier("dnnsmps.gmtp", ios::in);  // on ouvre le fichier en lecture

        if(fichier)  // si l'ouverture a réussi
        {
            int i= NULL;
            string compte;
            string login;
            string mdp;
            do
            {
                getline(fichier, compte);//récupération du compte
                getline(fichier, login);
                getline(fichier, mdp);
                i++;//incrémantation pour compter
            }while(i != numeroCompte);//tant que le numero du compte voulu est différent de celui ou on est
            cout<<compte<<":"<<endl<<"Login: "<< login <<endl<<"Mot de passe: "<< mdp << endl;
                fichier.close();  // on ferme le fichier
        }
        else  // sinon
             {
                  cerr << "Impossible d'ouvrir le fichier !" << endl;
             }
}

void afficherCompteTout(int trucQuiSertARien)//le paramètre ne sert a rien (je n'arrive pas a faire sans)
    fstream fichier("dnnsmps.gmtp", ios::in);  // on ouvre le fichier en lecture

        if(fichier)  // si l'ouverture a réussi
        {
            string compte;
            string login;
            string mdp;
            int numeroCompte=1;
            do
            {
                getline(fichier, compte);//on récupère
                getline(fichier, login);
                getline(fichier, mdp);

                cout << numeroCompte<<"-"<<compte<<endl;//on affiche
                numeroCompte++;//incrémentation pour la numerotation

            }while(getline(fichier, compte));//tant que je peut stocker une ligne dans compte


                fichier.close();  // on ferme le fichier

        }
        else  // sinon
                {
                    cerr << "Il faut ajouter des mots de passe avant de regarder si il y en a!!" << endl;//comme le fichier existe pas, il n'y as pas de mots de passe

                }

}


Mon problème:
Quand j'ai ajouter un 4ièm,8ièm,12ièm...ect(4 par 4) mot de passe, quand je fait"voir les mot de passe" sa me met:

Le resultat de la console:

-----Mots de passes enregistrer-----

Voici la liste des mots de passe enregistres:

1-machin
2-bidule
3-lala
4- //sa ne m'affiche pas nom de compte il est sensé s'afficher le 4ième compte enregistrer


Bon voila, j'ai fait un exposer introductif de mon problème
Pourriez vous m'indiquer une solution :o , si vous en connaisez une o_O

6 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
3 mai 2010 à 10:23
Hello,
Dans la fonction AfficherCompteTout(), tu lis 4 lignes mais tu n'en affiches que 3. En effet, la ligne que tu lis dans l'instruction while est perdue...
Entre nous, si ton paramètre ne sert à rien, tu peux le supprimer dans le prototype et dans l'appel de la fonction, non?


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
cs_curite Messages postés 8 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 4 mai 2010
3 mai 2010 à 13:22
C'est vrai je n'y avait pas pensé, merci. Mais je voulait savoir: dans l'arguent de while, ca compte vraiment pour une ligne lue, et sa change de ligne comme un "getline"? Si c'est sa, a mon avis il faudrait que je créer un fichier comprenant le nombre de mots de passe et dans la boucle je met une variable avec incremantation jusqu'à que sa affiche tout les compte. Corrigez moi si je me trompe.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
3 mai 2010 à 14:17
Ah bah vi! Ce n'est pas parce que c'est un argument à la condition while que ton getline ne lira pas une ligne
Inutile d'avoir un autre fichier pour avoir ta condition de fin.
Je te propose la façon suivante:
- dans ton fichier, tu crée une seule ligne par compte, une ligne comprenant donc un compte, un login, un mot de passe
- dans ton code, tu code un truc comme ceci:
while (getline(fichier,ligne)
{
  // récupération des différents champs

  // affichage
}



@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
cs_curite Messages postés 8 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 4 mai 2010
3 mai 2010 à 16:54
Ce n'est pas une mauvaise idée, mais c'est plus difficile que de stocker le nombre de compte dans un autre fichier. Merci pour l'idée je vais surement faire sa.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
3 mai 2010 à 17:15
mais c'est plus difficile que de stocker le nombre de compte dans un autre fichier

Non, je ne pense pas. Ce sera, de plus, plus facile à maintenir plutôt que 2 fichiers séparés.

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
cs_curite Messages postés 8 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 4 mai 2010
4 mai 2010 à 07:49
Je vais essayer les deux et je verrai quelle méthode est la plus rapide. En tout cas, merci pour cette très rapide.
0
Rejoignez-nous