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
    Membre habitu�
    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
    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

    [email protected]
    [email protected]
    [email protected]

    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
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    35
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    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
    Membre habitu�
    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
    Par d�faut
    euh je n'utilise pas de std::vector h�las

  4. #4
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    35
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    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 exp�riment�
    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
    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 : 51
    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
    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
    Membre habitu�
    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
    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 : 51
    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
    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
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    35
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    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
    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
    Membre habitu�
    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
    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
    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
    Membre habitu�
    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
    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
    Membre habitu�
    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
    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