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

LeaIUT 2 Messages postés dimanche 27 mars 2011Date d'inscription 29 mars 2011 Dernière intervention - 27 mars 2011 à 19:36 - Dernière réponse : LeaIUT 2 Messages postés dimanche 27 mars 2011Date d'inscription 29 mars 2011 Dernière intervention
- 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 =)
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 28 mars 2011 à 10:46
3
Merci
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

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cptpingu
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 28 mars 2011 à 10:37
0
Merci
- É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
Commenter la réponse de cptpingu
LeaIUT 2 Messages postés dimanche 27 mars 2011Date d'inscription 29 mars 2011 Dernière intervention - 29 mars 2011 à 11:29
0
Merci
Parfait!
Je te remercie énormément, c'est exactement ça
Et merci encore pour tes explications bien détaillées
Commenter la réponse de LeaIUT

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.