Probléme de boucle !!

chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007 - 8 mars 2005 à 16:29
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007 - 10 mars 2005 à 19:30
Bonjour ! Mon probléme est le suivant : J'ai un programme qui lit un
fichier LieuDate1.txt (fichier donc le comptenu peut varier mais pas la
forme )et ce programme prend différent champ de ce fichier pour le
cpier dans un autre fichier2.txt et pour faire cela j'utiliser une
boucle do while() mais dans mon code j'aurais besoin de récuperer en
dehors de la boucle ce que contiene mais different variable comme
MaxdB,Heure... donc j'aimerais savoir si il est possible de récuperer
le comptenu d'un variable en dehors d'un boucle, si pouvait m'indiquer
comment.

Merci beaucoup de votre aide !!





Mon code si dessous :



#include <fstream>

#include

#include <fcntl.h>

#include <string>

using namespace std;



void main(void)

{



char IdentifiantLigne[40]={'*'};



char Heure[20]; //Sert pour récuperer l'heure dans le fichier LieuDate1.txt ( cette heure est sous forme de colonne dans ce fichier)



char MaxdB[20];//Sert pour récuperer des lesures de dB dans le fichier LieuDate1.txt ( cette mesure est sous forme de colonne dans ce fichier)



char TempsDeDepassement[20];//Sert
pour récuperer le temps de dépassement dans le fichier LieuDate1.txt (
ce temps de dépassement est sous forme de colonne dans ce fichier)



ifstream fin;

ofstream fout;



// le constructeur de ifstream permet d'ouvrir un fichier en lecture



fin.open( "Lieu1Date1.txt", ios::in );

fout.open("fichier2.txt", ios::out);

if(!fout) {cout<<"erreur";exit(-1);};





//Boucle de récuperation de different champ du fichier LieuDate1.txt

do

{

fin>>IdentifiantLigne;

switch(IdentifiantLigne[1])

{



case 'E':

fin>>Heure>>MaxdB>>TempsDeDepassement;

fout<<MaxdB<<",";

break;



}



}while(IdentifiantLigne[0]!='*');

18 réponses

fabrice_pi Messages postés 91 Date d'inscription vendredi 12 mars 2004 Statut Membre Dernière intervention 5 août 2005
8 mars 2005 à 16:58
Salut,

tu peux te servir de tes variables Heure, MaxdB, TempsDeDepassement en
dehors de ta boucle sans problèmes. Par contre tu auras uniquement ceux
de la dernière ligne de ton fichier. Si tu veux tous les garder, fait
des tableaux.

Fabrice
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
8 mars 2005 à 17:15
Vi jai bien vu que cela prenait que la derniere ligne de mon fichier
mais pourrait s'il te plait m'indiquer la méthode que tu m'as expliquer
avec les tableau en faisant un exemple ou autre si possible merci de
ton aide
0
tibob51 Messages postés 268 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 mai 2013 2
8 mars 2005 à 18:13
Si veux récuperer plusieur valeur il te faut un tableau:

Voici ton exemple modifié:

char *tablo[40]; //Crétion d'un point vers un tableau


do
{
fin>>IdentifiantLigne;
switch(IdentifiantLigne[1])
{

case 'E':
fin>>Heure>>MaxdB>>TempsDeDepassement;
t[a]=new char[40]; //Création d'une nouvelle entrée (40 carac max)
strcpy(tablo[a],Heure); //Copie de Heure dans le tablo
fout<<MaxdB<<",";
break;
/*
Pour récuperer les élements utilise la syntaxe suivante:
t[numéro de l'enregistrement voulu];
*/
delete[] t; //N'oublie pas de detruire ton tableau
}

}while(IdentifiantLigne[0]!='
*');

Voilà j'espère que cet exemple te servira...
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
8 mars 2005 à 18:43
J'ai du rater un truc je crois car ca ne marche pas.

Moi j'ai remplacer t[a] par tablo[a] car sinon ca faisait des erreurs et disons quand je fais un cout<< sur t[numéro
de l'enregistrement voulu]; bas y a rien qui s'affiche et même si je le
met a en dehors de la boucle do while() ca ne marche pas non plus.
Merci de ton aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tibob51 Messages postés 268 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 mai 2013 2
8 mars 2005 à 23:24
Excuse j'aurai du relire j'ai fait deux bourres:
-Tu a raison c'est bien tablo[a];
-Et modifi le code comme ceci:

int a=0; //J'ai oublié ça!!!!!
do
{
fin>>IdentifiantLigne;
switch(IdentifiantLigne[1])
{

case 'E':
fin>>Heure>>MaxdB>>TempsDeDepassement;
t[a]=new char[40]; //Création d'une nouvelle entrée (40 carac max)
a++;//ET ceci

Voilà ca devrai mieu marcher!
0
fabrice_pi Messages postés 91 Date d'inscription vendredi 12 mars 2004 Statut Membre Dernière intervention 5 août 2005
9 mars 2005 à 08:53
Salut,



Il est toujours préférable de chercher sont code soit même... Par
contre j'ai une remarque : je commence à apprendre le C++ alors arrêtez
moi si je me trompe. Il me semble qu'il y a des bibliothéques (list,
vector, ...) qui seraient beaucoup plus simples à utiliser qu'un
tableau (et peut-être plus dans l'espris du C++ ?).

Fabrice
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
9 mars 2005 à 09:26
Juste une appaté pour fabrice_pi : je suis d'accord que c'est mieux
d'apprendre tous seul mais ca fais 15 jours que ca me prend le choux ce
truc donc voila mais si tu as une autre idée pour mon prbléme je veux
bien merci.



Pour tibo51 : jai fais les modifs de ton code sauf que maintenant que
je lance le programme y a une erreur windows donc rien ne s'affiche
pour voir si il y a bien la chaine de caractére dans la variable tablo
donc soit je me suis plenter ou autre je ne sais pas. Merci



Le code que j'ai fait :



int a=0;

do

{

fin>>IdentifiantLigne;

switch(IdentifiantLigne[1])

{



case 'E':

fin>>Heure>>MaxdB>>TempsDeDepassement;

tablo[a]=new char[40];

a++;

strcpy(tablo[a],Heure);

//fout<<MaxdB<<",";



break;

cout<<tablo[10];

}





}while(IdentifiantLigne[0]!='*');
0
fabrice_pi Messages postés 91 Date d'inscription vendredi 12 mars 2004 Statut Membre Dernière intervention 5 août 2005
9 mars 2005 à 09:38
Donne l'erreur windows ! Y'a au moins une chose évidente : Si tu as
plus de 40 lignes ça va planter puisque tu n'as déclaré qu'un tableau
de taille 40... D'où l'utilisation de vecteur ou de list dont la taille
est dynamique. Deuxième point :

tablo[a]=new char[40]; // tu alloues tablo[a],


a++; // tu incrémentes a


strcpy(tablo[a],Heure); // tu copies dans ton 'a' incrémenté, donc dans tablo[a+1] qui n'est pas alloué.

C'est simplement de la prog ! Et apprend à lire les erreurs ça peut aider...

Fabrice
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
9 mars 2005 à 09:52
Bas en faite c'est le rapport de windows qui s'ouvre et qui me dit que
le fichier.exe a recontrer une erreur (AppName:
fichier.exe AppVer: 0.0.0.0
ModName: fichier.exe

ModVer: 0.0.0.0 Offset: 00022ef2) sinon jai
fais un essai en mettant 200 au lieux de 40 par exemple et c'est
toujours pareil voila merci
0
fabrice_pi Messages postés 91 Date d'inscription vendredi 12 mars 2004 Statut Membre Dernière intervention 5 août 2005
9 mars 2005 à 10:05
Le plus important n'était pas le 200 ou lieu du 40 mais le deuxième
point qui fait que ton programme ne marchera jamais même avec 1 000 000
au lieu de 40... A parament tu n'arrives pas à faire la modif tout
seul. Essaie ça :
tablo[a]=new char[40];

strcpy(tablo[a],Heure);



a++;


Il faut simplement changer la ligne de a++

Fabrice
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
9 mars 2005 à 10:35
maintenant y a plus d'erreur mais ce que je comprend maintenant c'est
comment afficher ce que comptient tablo car moi je fais un cout comme
celui la "cout<<tablo[10];" mais bon je me fourvoie peut etre
dans un mauvais chemin voila les derniére nouvelle, et merci de te
pencher sur mon probléme.
0
fabrice_pi Messages postés 91 Date d'inscription vendredi 12 mars 2004 Statut Membre Dernière intervention 5 août 2005
9 mars 2005 à 10:45
ça s'affiche comme un tableau normal (il me semble, car j'ai comencé le C++ y'a 2 jours).



for(int i=0; i<SIZE; i++){

cout << tablo[i] << endl;

}



ou SIZE est la taille de ton tableau



Fabrice
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
9 mars 2005 à 10:53
Mais j'ai peur ne pas pouvoir m'en sortir si je fais une boucle dans
une boucle dans une boucle ca risque de bloquer a un moment et je pense
ne pas pourvoir répondre a mon probléme qui est de récuperer ce que
comptient mes variable de ma boucle en dehors de cette boucle.Enfin
voila merci
0
fabrice_pi Messages postés 91 Date d'inscription vendredi 12 mars 2004 Statut Membre Dernière intervention 5 août 2005
9 mars 2005 à 11:08
Pour ce qui est de récupérer tes variables en dehors de ta boucle, tibob51 t'as
montré comment faire. Le code que je te donne est à placer en dehors de
ta boucle de remplissage du tableau afin de vérifier le bon remplissage
de celui-ci. De plus tu n'es pas obligé d'afficher dans ta boucle, tu
peux très bien faire le traitement que tu veux sur tablo[i] à la place.


Les boucles bien comprises et donc bien faites ne bloques jamais.

Fabrice

0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
9 mars 2005 à 14:16
J'ai pigé le truc avec ta boucle mais quand je la place aprés ma boucle
while y a encore une erreur windows (l'instruction à "0x004245c0"
emploie l'adresse mémoire "Oxccccccc". la mémoire ne peut étre
read) mais qui empeche pas d'afficher dans le shell les valeurs,
je pense que c'est un probléme dans le code sur l'enregistrement dans
la mémoire mais aussi autre chose c'est que avec ton code je voie qu'il
y a des chose dans la variable tablo mais si j'applique ce que a dit tibob51 ca ne marche pas. Voila merci beaucoup de ton aide.
0
tibob51 Messages postés 268 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 mai 2013 2
9 mars 2005 à 23:01
Dabord merçi fabrice_pi de m'avoir corigé (je sais pas ce que j'ai fait,je craint ).
Et chanandler je voudrais savoir ce que tu veu faire avec ton "cout<<tablo[10];"

pour lire le tablo ecrit ça

for (int c=0;c<=a;c++) //Et oui a est encore valable ici donc tu connais le nb de tes enr.
{
cout << tablo[c];
cout <<"\n"

A++;
0
tibob51 Messages postés 268 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 mai 2013 2
9 mars 2005 à 23:02
Bon n'oublie pas (comme moi) de fermer la boucle for après les deux instructions.
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
10 mars 2005 à 19:30
Ok ! merci beucoup de ton aide ca ma aidé et j'ai fini par trouver, encore merci.
0
Rejoignez-nous