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 :

problème de std::out_of_range


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut problème de std::out_of_range
    Bonjour à tous,

    Malgré mes recherches sur google, je n'ai pas réussi à trouver la solution à mon problème.
    Je viens donc vous demander de l'aide concernant le programme que j'ai créé.
    Je tiens à préciser que je suis codeur depuis seulement 1 an donc mon code sera un peu sale...

    Donc en fait mon programme il prend un fichier .txt, va chercher toutes les adresses mails et les mets dans un autre fichier .txt sous le format

    kikou@toto.com
    s0nyk@toto.com
    tata@koko.com

    Cela me permet de l'importer plus facilement dans un fichier excel.

    Cela fonctionne bien sur un petit fichier mais j'ai testé sur un très grand fichier et cela m'a donné l'erreur : Exception non gérée à 0x74c9b727 dans stage_fichier_contacts.exe*: Exception Microsoft C++*: std::out_of_range à l'emplacement mémoire 0x0039f778..

    EDIT : bon apparement ce n'est pas la longueur du fichier, car j'ai testé avec un fichier carrément plus long et ça a fonctionné.
    Le fichier qui pose problème est en fait un "copier coller" d'un fichier PDF, si ça peut aider...


    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
    34
    35
    36
    37
    void lireFichier(){
     
    	ifstream fichier("entreprise.txt");  // on ouvre le fichier en lecture
     
        if(fichier)  // si l'ouverture a réussi
        {       
    		string ligne; //variable ligne de type string qui permettra de stocker la chaine de caractère
    		bool ok=false;
     
    		while (getline(fichier, ligne)) // tant qu'on est pas à la fin du fichier, on lit ligne par ligne.
    		{
    			while(ligne != "") // tant qu'on est pas à la fin de la ligne
    			{
    				string  mot;
    				mot = extraitMot(ligne); // cela met le premier  mot de la ligne dans la variable mot
    				mot = suppressionCaractere(mot); //ici on supprime les caractères inutils tel que ?, !, :, ; etc...
    				if (estUneAdresseEmail(mot))
    				{
    					string const nomFichier("adresseEntreprise.txt");
    					ofstream monFlux(nomFichier.c_str(), ios::app);
    					if(monFlux)
    					{
    						monFlux << mot <<  endl;
    					}
    					else
    					{
    						cout << "ERREUR: Impossible d'ouvrir le fichier." << endl;
    					}
    				}
    			}
    		}
            fichier.close();  // on ferme le fichier
    	}
        else  // sinon on met un message d'erreur
    	    cout << "Impossible d'ouvrir le fichier !" << endl;
     
    }

    J'espère que quelqu'un pourra m'aider, je vous remercie d'avance.
    N'hésitez pas à me poser des questions si je n'ai pas été assez clair.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    J'ai déjà eu l'exception "out_of_range" en essayant d'accéder à un élément de std::vector qui n'existait pas (par exemple, myvector.at(15) alors qu'il y a 10 éléments dans myvector). Si tu utilises des std::vector, vérifie tous les accès que tu y fais.

    Je ne sais pas s'il y a d'autres classes qui utilisent cette exception.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    euh je n'utilise pas de std::vector hélas

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    Etant donné qu'il s'agit d'une exception, tu peux essayer de la localiser en utilisant try{} catch{}. J'ai lu sur google que cette exception pouvait être levée par les ofstream et ifstream. Une fois localisée, ce sera plus facile de t'aider. Tu trouveras peut-être même le problème par toi-même

  5. #5
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    peut être plus simple pour lire le fichier :

    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
     
    void lireFichier( const char* inputFilename, const char* outputFilename)
    {
      ifstream inputFile( inputFilename );
     
      string mot;
      while( inputFile>> mot )
      {
        mot = suppressionCaractere( mot );
        if ( estUneAdresseEmail( mot ) )
        {
          ofstream monFlux( outputFilename, ios_base::app );
          if ( !( monFlux << mot ) )
            cout << "ERREUR: Impossible d'écrire le mot ["
              << mot << "] dans le fichier [" << outputFilename << "]"
              << endl;
        }
      }
    }
    et pour le out of range, peut être vous devriez regardez dans les fonctions
    suppressionCaractere, estUneAdresseEmail et extraitMot

    la classe string pourrait faire un out of range (sur substring ou at par exemple

    PS : Je n'ai pas compilé mon code.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Pour ce genre d'erreur, comme tu utilises Visual C++, tu as moyen si tu lances ton code en debug qu'il s'arrête automatiquement au moment où l'exception est lancée. Ça doit être dans un menu comme Debug/Exception où tu coches "thrown" sur les exceptions C++.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    je n'ai pas réussi à faire ce que tu m'as demandé JolyLoic...
    est ce qu'il s'agit bien de ça :
    http://imageshack.us/photo/my-images/638/exception.jpg/ ?

    sinon merci Hylvenir pour ton code simplifié =) , il fonctionne très bien.

    Sinon Cycloop, pour le try catch j'ai pas très bien compris comment ça marchait, j'ai testé un peu mais bon ça m'a pas avancé

    Voici le code de suppressionCaractere (code très moche lol) :

    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
    string suppressionCaractere(string chaine){
    	string res;
    	int taille, i, a, cpt;
    	i = taille = chaine.length();
    	cpt = a = 0;
     
    	while (i > 0 && (chaine[i - 1] == ',' || chaine[i - 1] == '?' || chaine[i - 1] == ';' || chaine[i - 1] == '"' || chaine[i -1] == ')' || chaine[i - 1] == '.' || chaine[i - 1] == ':' || chaine[i - 1] == '!' || chaine[i - 1] == '-' || chaine[i - 1] == '>' ))
    	{
    		++cpt;
    		--i;
    	}
     
     
    	if (chaine[taille-cpt] == '>' || chaine[taille-cpt] == ')')
    	{// si le caractère situé juste après l'adresse mail est un caractère supérieur ou une parenthèse fermante alors
    		for ( a; a<taille ; a++ )
    		  { // on déplace les caractères d'un cran vers la gauche
    			  chaine[a] = chaine[a+1]; 
    		  }
    		++cpt;
    	}
     
    	res=chaine.erase(taille-cpt,taille);
    	return res;
    }
    et voici celui de estUneAdresseEmail :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool estUneAdresseEmail(string s){
    	bool res = false;
    	for (int i=0; i < s.length() ; ++i) {
    		if (s[i] == '@')
    			res=true;
    	}
    	return res;
    }
    Merci pour votre aide en tous cas !

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par s0nyk Voir le message
    je n'ai pas réussi à faire ce que tu m'as demandé JolyLoic...
    est ce qu'il s'agit bien de ça :
    http://imageshack.us/photo/my-images/638/exception.jpg/ ?
    Oui. Maintenant, si tu lances ton code en mode debug, il doit t'afficher la ligne où l'exception est lancée, il ne te reste qu'à remonter dans la pile d'appels jusqu'à du code à toi pour voir où tu as un soucis.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    Oui tu as coché le bon truc, concernant la suggestion de JolyLoic.

    Concenrnant les try, catch, c'est une des fonctionnalités du c++

    en gros, ça fonctionne comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try{
    //...ton code...
    }
    catch std::out_of_range myexcepion {
    //...le code si une exception "out_of_range" est levée...
    }
    de manière générale, c'est une fonctionnalité vraiment intéressante du C+, je te conseille de te renseigner dessus

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,

    si cpt vaut 0, que vaut chaine[taille-cpt] ?

    Les algorithmes de la STL sont tes amis et t'évitent les déconvenues de dépassement de bornes car l'expressivité est plus claire :
    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 <algorithm>
     
    bool is_special_caractere( char c_)
    {
       static const std::string special_caracters = ",?;\").:!->";
       return special_caracters.find(c_) != std::string::npos;
    }
    std::string suppressionCaractere(std::string chaine)
    {
       chaine.erase(
          std::remove_if(chaine.begin(),chaine.end(),is_special_caractere)
          ,chaine.end()
       );
       return chaine;
    }
     
    bool estUneAdresseEmail(std::string s)
    {
       return s.find('@') != std::string::npos;
    }
    Un peu plus court non ? Compréhensible rien qu'en lisant, non ?

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour à tous,
    j'espère que vous avez passé un bon week end =)

    merci à tous pour votre aide
    j'ai résolu mon problème grâce au code de 3DArchi.
    Je ne connaissais pas les algorithmes de la STL, je vais donc y jeter un coup d'oeil =)

    En vous remerciant tous encore pour votre aide

    à bientôt

    EDIT: désolé de revenir vers vous. Je pensais que tout avait été réglé cependant je rencontre un autre problème.
    Tout fonctionne sous Visual studio sauf que pour le graphique j'ai utilisé Qt et ça ne fonctionne pas.

    Voici l'erreur :

    &'FenPrincipale::is_special_caractere': liste d'arguments manquante dans l'appel de fonction; utilisez 'FenPrincipale::is_special_caractere' pour créer un pointeur vers membre.

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par s0nyk Voir le message
    &'FenPrincipale::is_special_caractere': liste d'arguments manquante dans l'appel de fonction; utilisez 'FenPrincipale::is_special_caractere' pour créer un pointeur vers membre.
    Montre le code.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    euh bah c'est pratiquement le même qu'au dessus...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    bool FenPrincipale::is_Special_Caractere( char c)
    {
       static const string special_caracters = "<(,?;\"):!>";
       return special_caracters.find(c) != string::npos;
    }
     
     
    string FenPrincipale::suppressionCaractere(string chaine)
    {
        chaine.erase(remove_if(chaine.begin(),chaine.end(),FenPrincipale::is_Special_Caractere)
                     ,chaine.end());
       return chaine;
    }
    mais en fait j'ai mal compris la fonction remove_if, le 3e argument est une fonction booléenne qui prend 1 argument et la elle prend pas d'argument et pourtant ça marche.
    Pourrais me l'expliquer stp

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    j'ai finalement réussi à résoudre mon problème en modifiant le code de la fonction suppressionCaractere.
    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    string FenPrincipale::suppressionCaractere(const string &chaine)
    {
        char t[10] = { '<', '>', '(', ')', ';', '!', '?', ':'};
        QString a;
        a = QString::fromStdString(chaine);
     
        for (int i=0; i<10; ++i)
            a.remove(t[i]);
     
        return a.toStdString();
    }

    Merci à tous pour votre aide.

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

Discussions similaires

  1. Problème avec std::multiplies
    Par Bakura dans le forum SL & STL
    Réponses: 8
    Dernier message: 25/05/2007, 19h07
  2. problème avec std::cin
    Par _LVEB_ dans le forum SL & STL
    Réponses: 4
    Dernier message: 20/02/2007, 00h35
  3. Problème avec std::vector
    Par dhoorens dans le forum SL & STL
    Réponses: 4
    Dernier message: 31/12/2006, 14h27
  4. Problème de std
    Par Sachiel31 dans le forum MFC
    Réponses: 11
    Dernier message: 06/07/2006, 09h10
  5. Problème avec std::Vector
    Par mister3957 dans le forum SL & STL
    Réponses: 8
    Dernier message: 16/02/2006, 10h18

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