Exception anormale lors d'un substr C++

Résolu
LeaIUT Messages postés 2 Date d'inscription dimanche 27 mars 2011 Statut Membre Dernière intervention 29 mars 2011 - 27 mars 2011 à 19:36
LeaIUT Messages postés 2 Date d'inscription dimanche 27 mars 2011 Statut Membre Dernière intervention 29 mars 2011 - 29 mars 2011 à 11:29
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

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
28 mars 2011 à 10:46
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
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
28 mars 2011 à 10:37
- É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
0
LeaIUT Messages postés 2 Date d'inscription dimanche 27 mars 2011 Statut Membre Dernière intervention 29 mars 2011
29 mars 2011 à 11:29
Parfait!
Je te remercie énormément, c'est exactement ça
Et merci encore pour tes explications bien détaillées
0
Rejoignez-nous