Un programme pas trop compréhensible
Re-bonjour voila l'énnoncé d'un exercice que j'ai à faire mais je ne comprends pas trop cette histoire d'itérateur si quelqu'un voulez bien m'expliquez ce qu'on attend de moi dans l'exercice,
merci d'avance a vous tous!!!
Voici l'ennoncé:
Ecrivez un programme qui accumule son entrée standard en interne jusqu'à ce
qu'il y trouve une des deux lignes suivantes : "display" ou "rdisplay". Les
lignes vides sont accumulées aussi.
Dans le premier cas, il affichera alors toutes les lignes accumulées dans
l'ordre d'apparition. Dans le second, il les affichera dans l'ordre inverse.
Vous devez passer par des itérateurs, et utiliser le BON TYPE d'itérateur
suivant la direction du parcours.
La ligne "déclencheuse" n'est pas accumulée, et donc pas affichée.
Si aucune des deux lignes n'est trouvée dans l'entrée standard, on agit
comme si le flux s'était terminé par une ligne "display".
Après avoir traité une ligne "display" ou "rdisplay", le programme
recommence à accumuler des lignes, en ayant vidé son stockage au préalable.
Si l'entrée standard est vide, le programme n'affiche bien entendu rien du
tout.
Exemples :
$ cat was_demo1
hello
world
great
$ ./was < was_demo1
hello
world
great
$ cat was_demo2
hello
world
rdisplay
this
is
great
$ ./was < was_demo2
world
hello
this
is
great
$ ./was < /dev/null
$
Savoir utiliser argc et argv
Salut,
En fait, il semblerait que tu ne saches déjà pas ce que sont ni à quoi servent les parametre argc et argv de ta fonction main...
Dans la fonction
Code:
1 2 3 4 5
|
int main(int argc, char* argv[])
{
// le code
} |
(ou argc pourrait avoir n'importe quel nom, du moment que c'est un entier, et our argv également, pour autant que ce soit un tableau de pointeur de type char (ou un pointeur de pointeur de type char)):
argc représente le nombre d'argument passés à savoir:
1 s'il n'y a que la commande sous la forme de
ou 1+ nombre d'argument séparé par un espace, soit
Code:
1 2
| $: monapp <fichier ==>argc==2
$: monap < fichier ==>argc==3 |
la différence étant la présence ou non de l'espace entre > et fichier
argv, quant à lui, sera un tableau de chaines de caractères "type C" contenant l'ensemble des parametres passés à la commande à savoir
Code:
1 2 3 4
|
$: monapp ==> argv[0]=="monapp\0"
$: monapp <fichier ==> argv[0]=="monapp\0", argv[1]=="<fichier\0"
$: monapp < fichier ==> argv[0]=="monapp\0", argv[1]=="<\0", argv[2]=="fichier\0" |
La première chose à faire, c'est donc de vérifier le nombre et la valeur des arguments, et de gérer le fichier de sortie en fonction...
Un exemple parmis tant d'autre serait quelque chose du genre de
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
int main(int argc, char* argv[])
{
//personnellement je préfère les strings aux chaine "C like"
std::string chaine;
switch(argc)
{
case 1:
// l'utilisateur n'a pas donné de nom de fichier... y en a peut etre un
// par défaut ??? (sinon, il faudra gérer les choses correctement ;) )
chaine="fichierlogpardefaut";
break;
case 2:
// si < apparait, c'est accolé au nom du fichier
chaine=argv[1];
// oops... le < apparait peut etre
chaine=chaine.substr(chaine.find_first_not_of("<"),chaine.lengt());
break;
case 3:
//argv[1] a pris > et argv[2] a pris le nom du fichier
chaine=argv[2];
}
//"yapuka" ouvrir le fichier
std::ifstream fichier(chaine.c_str());
// et à continuer le traitement
} |
evidemment, cela signifie que le système n'interprète pas de lui meme la signification de <... tu devrait peut etre envisager l'utilisation de -f pour indiquer le fichier ;)