C++ Redirection sortie standard d'une console
Thesmarch
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis sous microsoft visual studio 10 en C++ Winform.
J'aimerais exécuter une ligne de commande, à partir du C++, qui génère une sortie standard.
Ce que je souhaiterais c'est obtenir cette sortie std dans une textbox, soit en temps réel soit une fois la commande terminée.
Cette la durée de traitement de cette commande peut être assez longue, donc j'aimerais aussi avoir une barre de progression.
Après plusieurs recherches, j'ai pensé faire quelque chose comme ca:
Le souci c'est que cette solution ne me permet pas d'obtenir la sortie std après l'exécution de la commande avec les arguments qui lui sont passés.
En effet j'obtiens uniquement :
Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
D:\Documents and Settings\user\Bureau\blackDetect\blackDetect>
J'ai également essayé d'ajouter le code ci-dessous mais j'ai une erreur à l'execution.
Merci d'avance pour votre aide!
Je suis sous microsoft visual studio 10 en C++ Winform.
J'aimerais exécuter une ligne de commande, à partir du C++, qui génère une sortie standard.
Ce que je souhaiterais c'est obtenir cette sortie std dans une textbox, soit en temps réel soit une fois la commande terminée.
Cette la durée de traitement de cette commande peut être assez longue, donc j'aimerais aussi avoir une barre de progression.
Après plusieurs recherches, j'ai pensé faire quelque chose comme ca:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { //envoi de la commande pour analyser le fichier avi //system(ccmd); //progressBar1->PerformStep(); Process^ compiler = gcnew Process; compiler->StartInfo->FileName = "cmd"; compiler->StartInfo->Arguments = "ffmpeg -i"; //"ffmpeg -i \""+fichierPath+"\" -vf blackdetect=d=0.5:pic_th=0.70:pix_th=0.00 -f null -"; compiler->StartInfo->UseShellExecute = false; compiler->StartInfo->RedirectStandardOutput = true; compiler->Start(); textBox2->AppendText(compiler->StandardOutput->ReadToEnd()); compiler->WaitForExit(); }
Le souci c'est que cette solution ne me permet pas d'obtenir la sortie std après l'exécution de la commande avec les arguments qui lui sont passés.
En effet j'obtiens uniquement :
Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
D:\Documents and Settings\user\Bureau\blackDetect\blackDetect>
J'ai également essayé d'ajouter le code ci-dessous mais j'ai une erreur à l'execution.
// Use a stream writer to synchronously write the sort input. StreamWriter^ sortStreamWriter = compiler->StandardInput; // Start the asynchronous read of the sort output stream. compiler->BeginOutputReadLine();
Merci d'avance pour votre aide!
A voir également:
- C++ Redirection sortie standard d'une console
- Test console steam deck - Guide
- Pilote son standard - Télécharger - Pilotes & Matériel
- Console action - Accueil - Jeu vidéo
- Remettre un pc en sortie d'usine - Guide
- Airpods 3 date de sortie - Guide
6 réponses
En effet, ce n'est pas du C++.
Je ne connais pas le C#, mais si c'est compatible avec les fonction C, il est possible d'utiliser popen https://linux.die.net/man/3/popen qui te permettra d'utiliser la sortie standard de ta commande comme un fichier.
Je ne connais pas le C#, mais si c'est compatible avec les fonction C, il est possible d'utiliser popen https://linux.die.net/man/3/popen qui te permettra d'utiliser la sortie standard de ta commande comme un fichier.
Merci pour votre aide!
Effectivement popen semble être une bonne idée.
J'ai du ajouter un : #include <conio.h>
Ainsi qu'un "_" avant "popen" afin qu'il fonctionne en C++ winform.
J'ai donc modifié mon code en :
Mais rien ne s'affiche dans la textBox2.
(Avec le debuger: str="")
Effectivement popen semble être une bonne idée.
J'ai du ajouter un : #include <conio.h>
Ainsi qu'un "_" avant "popen" afin qu'il fonctionne en C++ winform.
J'ai donc modifié mon code en :
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { FILE *output = _popen("ffmpeg -i", "r"); _pclose(output); char buffer[1024]; char *line_p = fgets(buffer, sizeof(buffer), output); String ^ str = gcnew String(line_p); textBox2->AppendText(str); }
Mais rien ne s'affiche dans la textBox2.
(Avec le debuger: str="")
Tu ferme ton output directement après l'avoir ouvert. Logique que tu n'aies rien, on ne peut lire sur un fichier fermé. Il faut mettre ton pclose() après la lecture.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Malheureusement même comme ça:
Ça ne fonctionne pas :(
Une autre idée?
Merci
FILE *output = _popen("ffmpeg -i", "r"); char buffer[1024]; char *line_p = fgets(buffer, sizeof(buffer), output); String ^ str = gcnew String(line_p); textBox2->AppendText(output); _pclose(output);
Ça ne fonctionne pas :(
Une autre idée?
Merci
Quand, je dis que ce n'est pas du C++, ce n'est pas pour faire mon chieur. Mais c'est pour dire qu'il ne faut pas chercher du côté du C ou du C++...
Je ne connais pas ce langage, mais il semble s'agir de VC ++ .Net. J'ai donc recherché sur google. Ce lien devrait t'intéresser :
https://dotnet.developpez.com/faq/cppcli/?page=Multithreading#redirectoutputprocess
Je ne connais pas ce langage, mais il semble s'agir de VC ++ .Net. J'ai donc recherché sur google. Ce lien devrait t'intéresser :
https://dotnet.developpez.com/faq/cppcli/?page=Multithreading#redirectoutputprocess
String ^ RedirectStdOutput(String ^nomProcess) { System::Diagnostics::Process ^ proc = gcnew System::Diagnostics::Process(); // On désactive le shell proc->StartInfo->UseShellExecute = false; // On redirige la sortie standard proc->StartInfo->RedirectStandardOutput = true; // On définit la commande proc->StartInfo->FileName = nomProcess; // Démarrage de la commande proc->Start(); // Attente de la fin de la commande proc->WaitForExit(); // Lecture de la sortie de la commande String ^ output = proc->StandardOutput->ReadToEnd(); // Libération des ressources proc->Close(); return output; }
Oui en effet j'ai utilisé cette solution dans un premier temps (mon premier post) mais le problème avec celle-ci c'est que la ligne de commande que je veux passer au terminal n'est pas exécutée, j'ai donc uniquement ça qui s'affiche:
Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
D:\Documents and Settings\user\Bureau\blackDetect\blackDetect>
Ce que je passe en argument n'est pas pris en compte.
Merci pour ton aide fiddy
Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
D:\Documents and Settings\user\Bureau\blackDetect\blackDetect>
Ce que je passe en argument n'est pas pris en compte.
Merci pour ton aide fiddy
Malheureusement, je vais pas pouvoir t'aider plus. Je ne connais pas ce langage. Même si cela peut s'approcher parfois du C++, il faut chercher du côté de la fonction donnée ci-dessous (et pas regarder du côté de _popen à mon avis, ça sera pas propre). En espérant que tu trouves un spécialiste du C++.Net ;-)))