Exception anormale lors d'un substr C++ [Résolu]

Signaler
Messages postés
2
Date d'inscription
dimanche 27 mars 2011
Statut
Membre
Dernière intervention
29 mars 2011
-
Messages postés
2
Date d'inscription
dimanche 27 mars 2011
Statut
Membre
Dernière intervention
29 mars 2011
-
Bonsoir,

lors de l'execution de mon programme, une exception me stoppe la progression:
"terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::substr"

je voudrais savoir comment affecter chaque mot d'une chaine à une variable.
J'ai une fonction qui ouvre un fichier, le lit (ligne par ligne) et qui doit ensuite découper chaque ligne en mot, et affecter ces mots à une variable.
Le type "Evenement" est un enregistrement avec jour (int), heureDebut et heureFin (float) et abrege et description (string). La fonction doit ouvrir un fichier texte rédigé comme tel :
5 11 12 ARC Architecture_Rattrapage
3 17 18.5 CPT Comptabilite_Rattrapage

Je voudrais donc par exemple que 5 soit affecté à evenement.jour, 11 soit affecté à evenement.heureDebut etc...

Donc pour cela j'ai cette procédure,
void lireFichierEvenements( Agenda &a) throw (string)
{
ifstream f;
f.open("test.txt");
string ch;
Evenement e;

if(f)
{
while (!f.eof())
{
string ligne;
getline(f, ligne);
e.jour =   convertInt(ligne.substr(0, 1));
e.heureDebut = convertFloat(ligne.substr(2, 2));
e.heureFin = convertFloat(ligne.substr(5, 2));
e.abrege = ligne.substr(8, 3);
e.description =  ligne.substr(12);
afficherEvenement(e);
}
}
else
    {
        cout << "ERREUR: Impossible d'ouvrir le fichier en lecture." << endl;
    }
    f.close();
}


ps: je teste la procédure sur un fichier ne contenant qu'une seule ligne pour le moment.

Le fichier texte est le suivant:

5 11 12 ARC Architecture_Rattrapage


Au resultat, le code nous affiche le résultat prévu (donc pas de problème jusque là) mais il y a quand même cette exception qui se lève.
Je ne comprends pas pourquoi, vu que je ne retire pas plus de caractères que ce que la chaine en contient.

Merci de votre aide =)

3 réponses

Messages postés
3813
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
12 juin 2020
109
J'allais oublier, si la forme de ton fichier est toujours la même, alors il y a bien plus simple:
while (f)
{
                   f >> e.jour >> e.heureDebut >> e.heureFin >> e.abrege >> e.description;
   afficherEvenement(e);
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
3813
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
12 juin 2020
109
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Évite aussi les "throw" c'est rarement utile, souvent gênant.

L'erreur veut dire que tu sors des bornes de ta chaîne.
Ex qui provoque l'erreur:
#include <string>

int main()
{
  std::string s = "coucou"; // Taille de 6
  s.substr(10); // Lève une exception

  return 0;
}


Donc avant de faire un substr(2,2) ou substr(5,2), regade déjà si "ligne" contient bien une chaine et si celle-ci a la bonne taille.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
2
Date d'inscription
dimanche 27 mars 2011
Statut
Membre
Dernière intervention
29 mars 2011

Parfait!
Je te remercie énormément, c'est exactement ça
Et merci encore pour tes explications bien détaillées