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

Langage C++ Discussion :

comportement de ifstream que je ne comprend pas


Sujet :

Langage C++

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 115
    Points : 125
    Points
    125
    Par défaut comportement de ifstream que je ne comprend pas
    Bonjour,

    mon problème c'est que ifstream fonctionne très bien si on lui indique dirèctement le fichier à ouvrir, mais si on lui indique d'abord un fichier non existant, puis un fichier existant, il l'ouvre mais ne le lit pas.

    Voilà le code:
    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
     
     //On initialise:
        string file_name=""; //le nom du fichier à ouvrir
        ifstream file; //le fichier à ouvrir
     
        if(argv[1])
        {
            file_name=argv[1]; //S'il existe un paramètre, on le donne en nom de fichier à ouvrir
        }
     
        while(1)
        {
            //On tente d'ouvrir le fichier et on vérifie si ça fonctionne
            file.open(file_name.c_str());
            if(file.is_open())
            {
                cout<<endl<<"File opened"<<endl<<endl; //On affiche un  message qui confirme l'ouverture du fichier et on essaie de lire les lignes.
                string line;
                while(getline(file, line))
                {
                    cout<<line<<endl;
                }
                file.close();
                break; //On ferme le fichier et on quitte la boucle while
            }
           //Si le fichier n'a pas pu s'ouvrir, on le ferme puis on demande à l'utilisatrice de retaper le nom du fichier, que l'on mettra dans file_name, puis on recommence la boucle.
            else 
            {
                file.close();
                cout<<"Fichier introuvable, veuillez entrer un autre nom de fichier: ";
                cin>>file_name;
            }
        }
    Le problème c'est que si on tape dirèctement le nom du fichier en paramètre, tout se passe bien.

    Mais si on le rentre par après, le message "File opened" s'affichera, mais pas les lignes.


    Merci d'avance à qui me répondra

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ca sent les flags de l'objet qui sont en position d'erreur.
    Pour les tester (puis les remettre à zéro) regarde du coté du type iostate et de tout ce qui est associé (bad(), good(), ...)
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 115
    Points : 125
    Points
    125
    Par défaut
    Oui merci, c'est bien ça !

    Si je test avec "file.is_open && file.good()" je ne rentre pas dans la boucle.
    Donc j'ai mis un file.clear() juste après l'avoir fermé et maintenant ça fonctionne très bien, merci encore

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Au final si tu fais un ifstream par fichier dans ta boucle, ton programme est beaucoup plus simple. ( et pas besoin de .close, de .clear, etc )

    ça peut juste ressembler à :

    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
     
    std::string file_name;
     
    if( argc > 1 )
    {
        file_name = argv[1];
    }
     
    bool file_found = false;
    while( ! file_found )
    {
        std::ifstream file( file_name.c_str() );
     
        if( file )
        {
                std::cout << std::endl << "  ..." << std::endl;
     
                string line;
                while( std::getline( file, line ))
                {
                    std::cout << line << std::endl;
                }
     
               file_found = true;
        }
        else
        {
             std::cout << "fichier introuvable etc.. : ";
             std::cin >> file_name;      
        }
    }

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 115
    Points : 125
    Points
    125
    Par défaut
    Ok, mais c'est pas moins performant de chaque fois créer un objet que d'appeler les fonctions d'un objet existant ?

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Michaeljackfan Voir le message
    Ok, mais c'est pas moins performant de chaque fois créer un objet que d'appeler les fonctions d'un objet existant ?
    Dans l'extrême absolu, oui...

    En effet, tu as, malgré tout, la construction et la destruction de l'objet qui prenne "un peu de temps" à chaque fois.

    Mais il faut rester également réaliste: pour observer un réel déclin des performances (comprend: pour que les performances déclinent à un point tel que tu soit capable d'observer une différence), il faudrait en arriver à une boucle devant s'exécuter plusieurs (dizaines de) milliers (pour ne pas dire des millions) de fois...

    Et je ne connais personne qui aura le courage d'introduire "a mano" une telle quantité de fichiers à tester

    Même en utilisant les pipes et autres techniques de sérialisation d'instruction, tu garde quand même un peu de marge

    De plus, on peut réellement estimer que la gestion même des fichiers représente un risque de goulot d'étranglement bien plus important que le seul fait d'effectivement créer et détruire une variable temporaire.

    N'oublie jamais:
    We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil
    Autrement dit, avant de t'inquiéter d'un problème qui ne te coutera que "quelques fréquences d'horloges", inquiète toi de l'efficacité de tes algorithmes, n'hésite pas à les refaire au besoin et ne reviens sur le problème de cette perte de quelques fréquences d'horloge qu'une fois que tu as la certitude que tu ne peux plus gagner de temps ailleurs, et que cela en vaut réellement la peine
    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

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

Discussions similaires

  1. Requête ayant un comportement que je ne comprends pas
    Par Kropernic dans le forum Développement
    Réponses: 0
    Dernier message: 08/09/2011, 12h25
  2. comportement que je ne comprend pas
    Par etienne.clopeau dans le forum Général Python
    Réponses: 15
    Dernier message: 17/07/2010, 23h37
  3. Réponses: 3
    Dernier message: 18/01/2010, 13h48
  4. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  5. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

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