Bonjour,
J'aimerais récupérer dans mon programme l'entrée :
Une simple utilisation du std::cin ne pourrait pas suffire ?Code:netstat -an > MonProg.exe param1 param2
Version imprimable
Bonjour,
J'aimerais récupérer dans mon programme l'entrée :
Une simple utilisation du std::cin ne pourrait pas suffire ?Code:netstat -an > MonProg.exe param1 param2
cin c'est la lecture du clavier.
Sinon tu as la fonction system() qui permet d'éxécuter des commandes de la console depuis l'application. Tu rediriges vers un fichier et il te reste plus qu'à lire la réponse avec un flux fstream.
Merci de ta réponse si rapide.
C'est vrai, je pourrais utiliser cette méthode là mais je suis convaincu qu'il est possible de faire ce que je veux en utilisant le flux d'entrée.
Théoriquement c'est très simple il doit bien exister une fonction/méthode pouvant lire le buffer d'entrée !
Tu ne pourras pas seulement avec un simple cin, le flux de clavier ne sert qu'a saisir au clavier via la console.
http://www.cplusplus.com/reference/iostream/cin/
Ensuite si tu veux utiliser netstat pour voir quel connexion sont établies tu peux toujours utiliser des bibliotheques qui test la connexion sur un port (selon l'OS sur lequel tu programmes et ce que tu souhaite faire).
Et avec argc, argv ?
int main (int argc, char **argv)
argc est le nombre de paramètres
argv est le tableau de paramètres mais attention argv[0] est le nom du programme
argv[0] = "MonProg.exe"
argv[1] = "param1"
argv[2] = "param2"
Oui, mon programme ayant pour objectif d'être utilisé par un script, netstat n'est qu'un exemple, comme ce pourrait être xcopy ou un programme de recherche de fichier en ligne de commande.
Mon problème peut peut-être être résolu avec un read pour lire le flux 0 n'est-il pas ?
As tu essayé la solution proposé par ArthurG ? Si tu veux rediriger le flux d'une commande vers un programme(ou fichier) en une ligne de commande tu vas devoir utiliser argc et argv ;)
Ok, donc
dans mon scriptCode:MonProg.exe "netstat -an"
et
dans mon code.Code:system(argv[1]);
Mais comment récupérer la sortie standard et la sortie err de cette commande du coup ?
Parce qu'unpour ensuite lire le/les fichiers de sortie je ne trouve pas ça optimal du tout !Code:system("netstat -an > out 2> err");
Merci de votre aide en passant :ccool:
Si tu veux optimiser dans ce cas n'utilise pas system(), mais plutôt la bibliothèque termio.h(sur Windows) ou termios.h (sur linux).
Si je me souvient bien ça permet de contrôler les terminaux, peut être que tu y trouveras ton bonheur dans cette bibliothèque , tient nous au courant :mrgreen:
Rebonjour,
Le problème n'étant pas comment faire pour aboutir à mes fins mais comment utiliser l'entrée standard, mon exemple :
était aberrant, c'est vrai.Code:netstat -an > MonProg.exe param1 param2
Mais avec un '|' est-ce toujours impossible ?
Je ne l'ai pas mentionné explicitement mais l'exécutable est fait pour être utilisé sur Windows et dans des scripts (.bat).Code:netstat -an | MonProg.exe param1 param2
Merci de m'éclairer :ccool:
Bonjour matyu,
C'est possible en utilisant getline sur cin :
Code:
1
2
3
4
5
6 string ligne; while ( getline(cin, ligne) ) { if ( ligne.length() > 0 ) { cout << ligne << endl; } }
Tu peux spécifier le caratère de fin de ligne tel que getline(cin, ligne, '\n').
Salut,
Non. std::cin lit à partir du flux d'entrée. Le flux d'entrée peut correspondre à une saisie clavier ou pas. argc/argv sont liés aux paramètres de la ligne d'exécution et sont différents.
Exemple :
Ensuite tu exécutes dans ta fenêtre DOS : prog.exe o | prog.exe iLa sortie standard (std::cout) du premier appel (prog.exe o) est redirigée vers l'entrée standard (std::cin) du second appel (prog.exe i).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
27
28
29
30
31
32
33
34
35
36
37
38 #include <iostream> #include <string> static const std::size_t nbr_ligne = 10; void input() { std::string ligne; for(std::size_t i =0;i<nbr_ligne;++i) { std::getline(std::cin,ligne); std::cout<<"copie de" << ligne<<"\n"; } } void output() { for(std::size_t i =0;i<nbr_ligne;++i) { std::cout<<" ligne n "<<i<<"\n"; } } int main(int argc, char*argv[]) { if(argc>=2) { switch(*argv[1]) { case 'i': input(); break; case 'o': output(); break; } } return 0; }