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

SL & STL C++ Discussion :

Gestion d'erreur suffisante sur un ifstream?


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut Gestion d'erreur suffisante sur un ifstream?
    Bonjour,

    Je sais que ça paraît une question de débutant mais je n'avais jamais utilisé la STL directement pour manipuler des fichiers.
    Après avoir passé un long moment sur la doc, je pensais utiliser cette technique :

    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
    std::ifstream  fs( _termsFilePath->c_str()  ) ;
    std::string line;
     
    if(!fs )
    {
    	//erreur
    }
     
    while( !fs.eof() )
    {
    	if(!std::getline(fs, line) )
    	{
    	      //erreur	
    	}
     
            //faire qqch avec line
    }
    Ensuite je suis tombé sur la faq C++ de dvp où on conseille cette approche :

    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
    #include <string>
    #include <fstream>
    #include <iostream>
     
    int main()
    {
        // le constructeur de ifstream permet d'ouvrir un fichier en lecture
        std::ifstream fichier( "fichier.txt" );
     
        if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
        {
            std::string ligne; // variable contenant chaque ligne lue
     
            // cette boucle s'arrête dès qu'une erreur de lecture survient
            while ( std::getline( fichier, ligne ) )
            {
                // afficher la ligne à l'écran
                std::cout << ligne << std::endl;
            }
        }
    }
    Je me demande si avec cette dernière, il n'y a pas un risque de confondre le cas ou la lecture s'arrête normalement à cause d'un eof() ou à cause d'une erreur?

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Pour faire la distinction entre une fin de fichier classique et une erreur il me semble qu'il faut vérifier en sortie du while si le flag badbit a été mis à 1 ou non.

    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
     
    // le constructeur de ifstream permet d'ouvrir un fichier en lecture
    std::ifstream fichier( "fichier.txt" );
     
    if ( fichier )
    {
       std::string ligne; // variable contenant chaque ligne lue
        while ( std::getline( fichier, ligne ) )
       {
          // afficher la ligne à l'écran
          std::cout << ligne << std::endl;
       }
       if(fichier.bad())
       {
          // Erreur pendant la lecture (qui n'est pas une simple fin du fichier)
       }
    }

  3. #3
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    La solution de la faq a également l'avantage d'être plus jolie (enfin, si on retire le if(fs) { ... } par un if(!fs) { return; } ... pour gagner un niveau d'indentation).

  4. #4
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Oui merci mais ce n'est pas un concours d'esthétique de code ce sont juste des exemples et la question est de savoir si on passe pas à côté d'un cas d'erreur. J'ai lu plein de blabla sur les forums à ce sujet mais il semble que personne sur le net n'en ait rien à faire des erreurs lors de la lecture.
    A croire que pour tout le monde, si le fichier a été ouvert, c'est succès assuré...
    Enfin si on ose pas se fier à cela, le bad bit mentionné par Arzar serait la bonne solution on dirait pour ne pas confondre la sortie de boucle en cas d'eof et la sortie de boucle silencieuse due à une erreur...

    De mon côté j'ai opté pour un code à base d'exception :

    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
     
    	std::ifstream  fs ;
    	std::string line;
     
    	fs.exceptions ( std::ifstream::failbit | std::ifstream::badbit );
     
    	try
    	{
    		fs.open("fichier.txt");
     
    		while( std::getline(fs, line) )
    		{
    			std::cout << line << std::endl;
    		}
    	}
    	catch(std::ifstream::failure& ex)
    	{
    		//lancer exception perso
    	}
    C'est la solution que j'utilise mais mes questions initiales demeurent. C'est pour ma culture générale disons.

  5. #5
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Je me demande si avec cette dernière, il n'y a pas un risque de confondre le cas ou la lecture s'arrête normalement à cause d'un eof() ou à cause d'une erreur?
    Non car le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ( std::getline( fichier, ligne ) )
    renvoie false dès qu'un flag est set (badbit, eofbit or failbit), ça a le même comportement que si tu faisais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ( std::getline( fichier, ligne ).good() )
    Donc le code de la faq est très bien Et celui de Arzar est adapté à ton cas, c'est en tout cas moins lourd et plus performant que d'utiliser des exceptions.

  6. #6
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Ca je l'ai compris mais il renvoie aussi faux si le bit eof est mis...
    Donc tu pourrais avoir ta lecture qui s'arrête au milieu du fichier sans que tu saches jamais que quelque chose s'est mal passé, c'est le risque de confondre que je mentionne dans mon premier post.

    C'est pour cela que je pensais à une solution qui teste EOF séparément...

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

Discussions similaires

  1. [AC-2003] Gestion d'erreur persistante sur minuterie
    Par fdalyon dans le forum IHM
    Réponses: 2
    Dernier message: 10/04/2010, 15h48
  2. Réponses: 4
    Dernier message: 13/09/2006, 16h53
  3. gestion d'erreur resume next sur une portion de code
    Par aarlock dans le forum Access
    Réponses: 2
    Dernier message: 02/06/2006, 15h28
  4. [PHP-JS] gestion des erreurs sur liste déroulente
    Par HwRZxLc4 dans le forum Langage
    Réponses: 9
    Dernier message: 28/05/2006, 03h21
  5. [VBA-E] Pb sur gestion des erreurs
    Par micoscas dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 08/03/2005, 17h08

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