Output eines externen Programms "abfangen" und ggf. bearbeiten...
-
Hallo!
Ist es möglich den output eines durch system(const char*) ausgeführten Befehls kontrolliert/gar nicht auszugeben und bei Bedarf (zeilenweise) zu bearbeiten?
Ich möchte/kann nicht alles selber neu programmieren wenn es dafür schon professionelle Konsolenprogramme gibt... Gibt es dafür eine elegante Lösung?
Bye, Pigeon
-
Auf die Schnelle fällt mir da Ausgabeumleitung des externen Programmes in eine Datei ein.
system( "theexe.exe > data.dat" ); ifstream in("data.dat"); ....Kurt
-
Hmm... diese Lösung hat ja nichts mit C++ zu tun.

Ich möchte ein Konsolenprogramm schreiben, dass - grob gesagt - ein anderes steuert, indem es den Output abfängt und zB erkennt, dass jetzt zB ein Passwort verlangt wird, da "passwd:" ausgegeben, aber nicht angezeigt wird. Dann kann man das passwort eingeben, was dann wieder an das externe programm weitergegeben wird. Eine virtuelle konsole sozusagen...
Natürlich erfüllt mein kleines Porjekt einen Funken Sinn im Gegensatz zu diesem Beispiel hier.
-
Pigeon schrieb:
Ist es möglich den output eines durch system(const char*) ausgeführten Befehls kontrolliert/gar nicht auszugeben und bei Bedarf (zeilenweise) zu bearbeiten?
Das war die Fragestellung.
Von Eingaben in das Externe Programm ist da nirgends die Rede.
Drück das nächste mal besser etwas konkreter aus. Kann dein Problem leider nicht auf meiner Glaskugel erkennen.
Und den Funken Sinn den dein Programm haben soll musst du erst noch erklären
K.
-
ZuK schrieb:
Pigeon schrieb:
Ist es möglich den output eines durch system(const char*) ausgeführten Befehls kontrolliert/gar nicht auszugeben und bei Bedarf (zeilenweise) zu bearbeiten?
Das war die Fragestellung.
Von Eingaben in das Externe Programm ist da nirgends die Rede.
Drück das nächste mal besser etwas konkreter aus. Kann dein Problem leider nicht auf meiner Glaskugel erkennen.
Und den Funken Sinn den dein Programm haben soll musst du erst noch erklären
K.Nehmen wir an jemand stellt diese (zwar dämliche, aber dafür sehr "konkrete" Frage:
Wenn Autofahren verboten ist, nachdem man etwas getrunken hat, warum haben Bars und Kneipen Parkplätze?
Ich schätze du hast den ganzen Satz gelesen? Denn wenn du nur "(...) warum haben Bars und Kneipen Parkplätze" lesen würdest, hätte der Satz ne andere Bedeutung. Also lies bitte meinen ganzen Post um sinngemäß zu antworten : Du gehst nämlich nicht daruaf ein wie man den Output gar nicht ausgibt
(so brauchst du auch nicht die Glaskugel)
Dass ich den Sinn des Programms erklären "muss" finde ich nicht.. ist ja meine Sache was ich mit den Möglichkeiten - die ich hier erfahren will - anstelle.
Also wenn du gleich so gereizt reagierst/bzw meine Person oder dieser Thread dich reizt, so irgnorier ihn doch einfach und lass Leuten den Vortritt die bei der Sache bleiben. DankeP.S.: Das mit dem Passwort war ein Beispiel um meine unkonkrete Frage zu konkretisieren.
-
Pigeon schrieb:
Du gehst nämlich nicht daruaf ein wie man den Output gar nicht ausgibt

Also offensichtlich begreifst du nich dass mein Beispiel eben den ganzen Output des externen programmes in eine Datei umleitet ( es erscheint daher überhaupt nichts an Bildschirm ). Das anlegen des ifstream objektes sollte auch nur andeuten dass du den umgeleiteteten Output in deinem Programm einlesen könntest und selbst entscheiden kannst wie du die Daten anzeigen willst.
Nach meiner Meinung war das eine vollständige Lösung deiner Aufgabenstellung. Wenn du das nicht verstehst kann ich leider nicht weiter helfen.
K
-
Tatsaechlich! Da wird nix ausgegeben. Dann hattest du ja recht

Da wir nun nicht mehr auf Glaskugel-Niveau reden, kannst du mir doch sicher noch eine Loesung ohne Umleitung in eine Datei anbieten. Vorhin hab ich das Beispiel mit der passwort cin-Eingabe genannt, ist das ein groesserer Aufwand oder wie kann man die Eingabe weiterleiten um zB eine GUI fuer ein Konsolenprogramm zu erstellen?
-
Hallo,
Standard-C++ bietet keine Mittel für Interprozess-Kommunikation. Abhängig von deinem verwendeten BS gibt es aber viele mögliche Wege. Einer wäre z.B. die Verwendung von pipes (popen/pclose...)
-
Unter Windows mit CreatePipe und CreateProcess
-
Nichts standardmäßiges also...

Ich benutze fast ausschließlich Gentoo (Linux) und portiere nur sehr wenige Sachen auf Windows. Gibt es da was unabhängiges? Und was hat es mit den pipes auf sich? *google gerade bemühe*//Edit:
Ich habe folgendes gefunden:
http://members.aon.at/hstraub/linux/socket++/docu/socket++_11.html
...und mir das Gentoo-Packet "Socket" emergt. Ich probier damit mal rum. Danke!//Edit 2:
Wenn ich dieses (notwendigerweise modifiziertes) Beispiel vom o.g. Link versuche zu kompilieren...
#include <iostream> #include <socket++/pipestream.h> using namespace std; int main () { char buf[128]; ipipestream p("/bin/date"); p.getline (buf, 127); cout << buf << endl; return 0; }... so erscheint folgender Fehler:
[sammy@Blueberry](~) $ g++ pipe.cpp -o pipe
/tmp/cc1ecDst.o: In functionmain': pipe.cpp:(.text+0x26): undefined reference toipipestream::ipipestream[in-charge](char const*)'
collect2: ld returned 1 exit statusKann mir das jemand erklären?

-
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?BoostProcess
Vielleicht hilft das? ist aber nichts offizielles.
-
Artchi schrieb:
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?BoostProcess
Vielleicht hilft das? ist aber nichts offizielles.
Das kann ich leider nicht ausprobieren, da der Download-Link nicht funktioniert...
Um auf die Pipes zurückzukommen, ich finde leider nichts weiteres was mich damit weiter bringt. Kann sich niemand vorstellen warum das Beispiel in meinem letzten Post nicht funktioniert?
-
Pigeon schrieb:
Kann sich niemand vorstellen warum das Beispiel in meinem letzten
Post nicht funktioniert?Doch kann ich.
Kurt
-
ZuK schrieb:
Pigeon schrieb:
Kann sich niemand vorstellen warum das Beispiel in meinem letzten
Post nicht funktioniert?Doch kann ich.
KurtDas freuet mich für dich und lasset mein Herz erquicken!
Nur würd ich die Lösung auch gern wissen. Verrätst dus mir? Sonst muss ich mir bei eBay ne Glaskugel bestellen...
*g*
-
Ah du willst das auch wissen. ( gefragt haste nicht ).
Würde sagen dass du die zugehörige library zu deinem programm dazulinken musst.
Kurt
-
ZuK schrieb:
Ah du willst das auch wissen. ( gefragt haste nicht ).
Würde sagen dass du die zugehörige library zu deinem programm dazulinken musst.
Kurtwie denn linken? reicht nicht #include <socket++/pipestream.h>
-
Nein reicht nicht. Die zugehörige library muss noch irgendwie ( kenn deine IDE nicht ) bei den linker-optionen ins Project.
Kurt
-
ZuK schrieb:
Nein reicht nicht. Die zugehörige library muss noch irgendwie ( kenn deine IDE nicht ) bei den linker-optionen ins Project.
Kurt:-| Meine IDE ist die Konsole... und kompiliere gcc. g++ pipe.cpp -o pipe!
-
Nehmen mir mal an die library ist eine statische lib heisst libsocket.a.
dann wärs etwag++ pipe.cpp -lsocket -o pipeeventuell ( wenn die library nicht im normalen library pfad installiert ist )
g++ pipe.cpp -L/usr/waoauchimmer/wiauchimmer -lsocket -o pipeKurt
-
ZuK schrieb:
Nehmen mir mal an die library ist eine statische lib heisst libsocket.a.
dann wärs etwag++ pipe.cpp -lsocket -o pipeeventuell ( wenn die library nicht im normalen library pfad installiert ist )
g++ pipe.cpp -L/usr/waoauchimmer/wiauchimmer -lsocket -o pipeKurt
geht mit -lsocket++ ausgezeichnet! Danke
