Flux qui ne marche plus apres erreur c++

Fermé
ascvbnxw Messages postés 2 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 14 mars 2012 - 14 mars 2012 à 16:30
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 16 mars 2012 à 08:11
Bonjour,

j'ai un problème avec mon programme c ++, plus précisément avec une fonction qui doit lire différents type de variable dans un fichier texte. Lorsque j'effectue des tests dans ma fonction (pour savoir si je lie le bon type de variable ou non), seulement lorsque ma fonction détecte une erreur, le flux ne marche plus ou mal, et me dit que tous les types qui suivent sont faux.

Voila ma fonction :

param_struc lire (ofstream & fluxerreur )
{
param_struc parametre;
ifstream entree; // ouvre un flux
if (entree.fail ())
{
cerr << " ERREUR " << endl ;
}
else {
entree.open ("F_parametre.txt", ios ::out|ios:: app);
entree >> parametre.nom_de_la_fonction ;
if (!(entree >> parametre.amplitude)) // Test sur le type de l'amplitude
{
string const nom_fichier ("F_periode.txt");
fluxerreur << "Amplitude incorrecte, valeur par defaut : 10." << endl; // ecrit dans le fichier de sortie
}
if (! (entree >> parametre.nombre_de_points))
{
string const nom_fichier ("F_periode.txt");
fluxerreur << "Nombre de points incorrect, valeur par defaut : 20." << endl; // ecrit dans le fichier de sortie
}
if ( !(entree >> parametre.offset))
{
string const nom_fichier ("F_periode.txt");
fluxerreur << "Offset incorrect, valeur par defaut 0." << endl; // ecrit dans le fichier de sortie
}
if (!(entree >> parametre.amplitude_bruit))
{
string const nom_fichier ("F_periode.txt");
fluxerreur << "Amplitude bruit incorecte, amplitude du bruit par defaut : amplitude/12." << endl;
}
entree.close(); // ferme le flux
}
return parametre;
}

Pour donner un exemple avec cette fonction, si l'amplitude du bruit est incorrecte est un string (dernière variable) le programme m'affiche un message d'erreur dans mon fichier de sortie.
Par contre si l'amplitude est un string par exemple(première variable à être lu), le programme va me dire que toutes les autres variables sont de mauvais type, le programme va alors m'afficher tous les messages d'erreurs les uns à la suite des autres. Pourquoi la lecture du flux s'arrête ou ne marche plus correctement après une erreur, et comment pourrait on le corriger ?


Merci d'avance

4 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
14 mars 2012 à 16:47
entree.open ("F_parametre.txt", ios ::out|ios:: app);
je ne comprend pas ce que tu cherches à faire tu défini un flux entrant mais tu lui dit que tu veux ecrire dedans (out). Ensuite, normalement ios::app te place à la fin du fichier, tu ne peux donc plus lire sur ce flux. Utilise ios::in, c'est plus logique.
Le mieux est de tester le flux après avoir fait le open. Comme ça, tu détecte les erreurs de chemin ou de fichier.
0
ascvbnxw Messages postés 2 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 14 mars 2012
14 mars 2012 à 17:38
Merci pour ta réponse, je vais changer ça, mais comment fait on t on pour tester le flux apres le open pour détecter les erreurs de chemin ou de fichier ?
0
Je voudrais également savoir s'il n'y a pas un autre moyen de récupérer mes variables et de tester leurs type une par une de manière à mieux gerer les erreurs. Parce que je ne trouve pas la solution à mon problème avec cette manière de récupérer mes variables.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
16 mars 2012 à 08:11
pour tester un flux en C++, il suffit de faire "if(flux)" ou d'utiliser fail() comme tu l'as fait.
https://en.cppreference.com/w/cpp/io/basic_fstream
Tu devrais trouver dans ce lien ton bonheur.
ça n'as pas trop de sens de tester un type sur une lecture de fichier. Un fichier ce n'est qu'une suite de 0 et de 1, ce que tu fais c'est interpréter cette suite d'une certaine manière. Ainsi, tel que tu ouvres ton fichier tu considère que tu fais des paquets de 8 et que tu lit des caractères. Ensuite, le C++ a un mécanisme pour interpréter et transformer les chaines de caractères en nombre.
Donc, si tu lui demandes de remplir un nombre et que tu lui fourni que des lettres, il y aura une erreur de conversion, pas forcément une erreur de flux.
Si tu veux tester un type, tu n'as pas beaucoup de choix, tu récupères des string que tu traite dans le sens que tu veux.
0