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 :

affichage d'un fichier


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut affichage d'un fichier
    bonjours, voilà mon probleme: j'ai crée une petite fonction qui à pour rôle d'afficher les login et password qui se trouvent dans un fichier sous cette forme:
    login|password
    login2|password2
    mon probleme est que ça ne m'affiche pas du tout ce que je souhaite...

    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
    using namespace std;
    bool loadAdmin()
    {
        string data;
        char stop = 124; // correspond au code ASCII de ce caractère "|"
        char impair=true;
        ifstream file("Data/player/admin.txt", ios::in);
        if (file == false)
        {
            cout << "! echec de l'ouverture du fichier" << endl;
        }
        else
        while (getline(file,data))
        {
            if(impair == true)
            {
                getline(file, data, stop);
                cout << data;
                impair=false;
            }
            if(impair == false)
            {
                getline(file, data);
                cout << " "+data << endl;
                impair=true;
            }
        }
        file.close();
        cout << " chargement de la liste des administrateurs effectuee!" << endl;
        return true;
    }

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 29
    Par défaut
    Déjà, je vois 4 problèmes dans ton code ...

    1) Évite de mettre des valeurs numérique à des "char"
    2) Ensuite, c'est quoi cette valeur booléenne à un char ?
    3) Met des parenthèses à ton bloc else, parce du coup, si l'ouverture ne réussi pas, il va t'afficher que ça n'a pas réussi et après que ça a réussi...
    4) Pourquoi tu mes une valeur de retour si elle sera toujours vrai ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 50
    Par défaut Lecture dans un fichier
    Bonjour,

    Je pense que tu as commis une erreur dans l'utilisation de la fonction getline.
    Il faut que tu récupère tout d'abord une ligne:

    string line;
    while (getline(file,line)) {

    ensuite tu peux stocker le contenu de ta ligne dans un flux stringstream afin de pouvoir travailler dessus:

    stringstream ss;
    ss << line;

    pour récupérer le nom et le mdp, tu utilises ta fonction getline deux fois:
    string nom, mdp;
    getline(ss, nom, '|');
    getline(ss, mdp, '|');

    Tu réalise cette opération autant de fois que cela est nécéssaire.

    ++

  4. #4
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Deux autres remarques…

    Tu commences par lire une ligne de ton fichier au début de la boucle « while », pour vérifier que le flux est toujours valide.
    Sauf que tu n'en fais rien !
    Du coup, tu perds une ligne à chaque itération…

    Ensuite, ton « booléen »…
    Tu l'initialises à « true ». Soit.
    Au début de la boucle « while », on teste s'il vaut « true » ; comme c'est le cas, on rentre dans le bloc « if », et à la fin on lui affecte « false ».
    Deuxième test de la boucle, on vérifie s'il vaut « false » ; c'est le cas, alors on rentre dans le bloc « if », et à la fin on lui affecte « true ».
    Fin de la boucle, itération suivante.
    On teste s'il vaut « true »…

    Au final, on rentre systématiquement dans tous les blocs « if » de la boucle.
    Donc ces tests sont inutiles.
    Mais alors, quelle est l'utilité de ce « booléen » ?

    PS: Puisque toutes les lignes ont un format et un nombre de tokens bien définis, tu n'es pas obligé de passer par un std::stringstream pour analyser le contenu des lignes.
    Mais dans le cas général, c'est la bonne méthode.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut
    @terry
    1) Évite de mettre des valeurs numérique à des "char"
    Le compilateur, ne voulais pas prendre en compte char stop "|"; j'ai donc donc du le remplacer par sa valeur ASCII

    2) Ensuite, c'est quoi cette valeur booléenne à un char ?
    Une erreur de ma part, je voulais effectivement mettre bool, mais pour je ne sais quel raison j'ai mit char.

    3) Met des parenthèses à ton bloc else, parce du coup, si l'ouverture ne réussi pas, il va t'afficher que ça n'a pas réussi et après que ça a réussi...
    Un simple et bette oublie... honte à moi

    4) Pourquoi tu mes une valeur de retour si elle sera toujours vrai ?
    ça s'est temporaire, c'était pour les test, mais ça va viré, et être remplacer dès lors que le chargement des infos du fichier sera correctement mit en place.


    @steph:
    la variable impair joue un rôle important, cela peut semblé inutile au premier regard, mais son rôle est réel:
    la première fois dans la boucle while, impaire vaut true, et donc on rentre dans le premier if, ici on utiliser getline(file, data, stop), donc on enregistrera dans data les information du début du fichier jusqu'au caractère stop qui ici est "|" ==> donc on lit le login. puis impair vaut false
    donc la seconde fois dans la boucle while, on entre dans le seconde if, et ici on ne li pas jusqu'au caractère stop, mais jusqu'au caractère "/n" fin de ligne. grace à getline(file, data) (remarque, il n'y a pas de 3eme paramètre, donc la lecture se fin jusqu'à la fin de ligne) ==> donc on li le mot de pass.
    sinon je vois ce que tu veut dire. on li le premier et ensuite le second...oui j'ai effectivement zaper ça...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut
    stringstream ss=line; //error, std::stringstream has initializer but incomplete type

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Une petite remarque de départ: le paramètre ios::in est implicite pour les ifstream, étant donné que c'est la classe qui s'occupe... des fichier entrant (Input File STREAM).

    Sinon, il existe une quantité non négligeable de solution simples et efficace pour traiter ton problème.

    En voici quelques unes:

    La fonction getline présente également une signature prenant trois paramètres: istream& getline ( istream& is, string& str, char delim ) où "delim" représente le caractère qui doit être utilisé comme délimiteur (en plus du retour à la ligne).

    Nous pourrions donc parfaitement envisager de lire directement deux chaines de caractères avec deux appels successifs à getline sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    std::ifstream ifs("fichicer.txt");
    if(ifs)
    {
        std::string login;
        std::string pass;
        while(std::getline(ifs,login,'|') && std::getline(ifs,pass))
        {
            /* nous n'avons plus qu'à gérer login et pass */
        }
    }
    else
    {
        std::cout<<"impossible d'ouvrir le fichier"<<std::endl;
    }
    Nous pourrions également décider d'utiliser les fonctions find et substr de la classe string.

    La première permet de trouver un caractère donné dans la chaine, la seconde de récupérer une souschaine:
    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
    std::ifstream ifs("fichicer.txt");
    if(ifs)
    {
        std::string in;
        while(std::getline(ifs,in))
        {
            size_t found=in.find('|');
            if(found !=std::string::npos)
            {
                std::string login=in.substring(0,found);
                std::string pass=in.substring(found+1);
                /* nous n'avons plus qu'à gérer login et pass */
            }
            else
            {
                throw BadFileFormat(); // exception à définir toi-même
            }
        }
     
    }
    else
    {
        std::cout<<"impossible d'ouvrir le fichier"<<std::endl;
    }
    Et il serait bien sur possible de trouver quantité d'autres solutions à coup de masturbation mentale, mais, la première ligne de ma signature devrait être une ligne directrice dans tout développement
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par baiphoa Voir le message
    stringstream ss=line; //error, std::stringstream has initializer but incomplete type
    Et si tu essayais d'inclure le fichier d'en-tête correspondant ?
    Il s'agit de « sstream », pour information.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut
    merci pour votre aide!

    @steph: oui maintenant que je sais que cela nécessitai un au autre include, je comprend cette erreur xD encore merci.

    @koala010: merci de m'avoir éclairé de ta lanterne, j'ai finalement opté pour ta première solution, simple et efficace, maintenant il ne me reste pulque à entré ça sous forme d'un array

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut
    j'ai une autre question qui me trote dans la tête, connaissez vous une fonction ayant le même rôle que atoi, mais pour les double en Cpp?
    car enfaite parfois je doit récuperé des string qui ne contiennent rien d'autre que des double.

    PS: oui j'ai bien dit double, car j'ai besoin de très grand nombres

  11. #11
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Non, je ne pense pas qu'une telle fonction existe.
    Par contre : http://cpp.developpez.com/faq/cpp/?p...RINGS_strtonum
    Bon, il y a une petite manipulation à faire, mais je pense que tu sauras trouver laquelle…

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/01/2006, 22h10
  2. Script permettant l'affichage d'un fichier via onmouseover
    Par HNT dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/10/2005, 23h58
  3. Affichage d'un fichier graphique (GIF, BMP,...)
    Par tonycalv dans le forum MFC
    Réponses: 2
    Dernier message: 12/09/2005, 08h26
  4. Formater l'affichage d'un fichier
    Par devdev2003 dans le forum Linux
    Réponses: 3
    Dernier message: 28/06/2005, 18h47
  5. Optimiser l'affichage d'un fichier XML de grosse taille...
    Par UnPeuPerdu dans le forum XML/XSL et SOAP
    Réponses: 11
    Dernier message: 03/06/2004, 17h01

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