Wie STDIN/-OUT in Datei speichern und gleichzeitig in Console ausgeben?
-
Hallo, ich habe eine Shell erstellt mit der man Befehle ausführen kann, nun möchte ich eine Log Funktion integrieren die die Ausgabe der Console 1:1 noch in eine Datei speichert, wie würdet ihr das realisieren?
-
Was spricht dagegen eine Pipe zum lesen zu öffnen die Daten zu lasen und gleichtzeitig in den neuen Prozess weiter zu geben?
Wenn Du Dir den Code ansiehst wie man ganz allgemein stdin/stdout umlenkt ist das ganze doch kein Problem.
-
Kannst du es bitte an einem Hello-World Beispiel zeigen
-
Nein! Weil ich dafür einfach keine Zeit habe.
Versuch es doch erstmal selber und Frage dann bei Problemen nach.
-
Erzeugst du die Konsolenausgabe selbst ?
Wenn ja, warum speicherst du die Ausgabe nicht einfach mit den FILE* Funktionen ?
(fopen, fprintf, fclose)
?
-
Ja die Konsole selbst erstellt die Ausgabe, deshalb dachte ich mir man erstellt eine Pipe welche in eine Datei und eine auf die Console geschrieben wird.
Hier ein Beispiel wie die Shell aussehen könnte:
void prompt() { cout << ":>>"; } int main () { string input; do{ prompt(); getline(cin, input); if(input == "exit") { return 0; } else if(input == "dir") { system("dir"); } //... }while(1); return 0; }
Das was man sieht sollte auch in eine Datei geschrieben werden, wie würdet ihr das lösen??
-
Ich würde eine eigene Streambuffer-Klasse dazwischenhängen, die die Ausgaben aufspaltet:
class split_buf:public streambuf { public: streambuf *first,*second; split_buf(streambuf*f,streambuf*s); //alle Ausgabefunktionen schicken die Daten an first UND second }; ofstream log("log.txt"); split_buf buf(cout.rdbuf(),log.rdbuf()); streambuf* oldcout=cout.rdbuf(&buf); ... cout<<"Hallo"<<endl; ... //sicher ist sicher - alten Status zurücksetzen cout.rdbuf(oldcout);
-
Schau Dir al Basic doch bitte mal erst den Artikel um CreateProcess an.
Mit system kannst Du gar keine Ausgabe umleitung hinbekommen. Das verwendet nur die aktuellen Handles.Evt. geht es auch so:
Du müsstest stdout neu Öffnen auf eine eigene Pipe, die Du liest und wieder an das alte Handle ausgibst. Die Daten dazwischen speicherst Du dann in eine eigene Datei.
-
Ich weiß nicht genau wie oder wo ich anfangen soll, habe folgendes Beispiel angeschaut kann man das auch hierfür verwenden: http://msdn2.microsoft.com/en-us/library/aa363875.aspx
-
Was soll Dir das bringen? Das erzeugt eine temporäre Datei...
Ich meinte diesen Code: http://support.microsoft.com/kb/190351/en-us
Ich gebs auf...
-
Klappts ?
-
@ Martin Richter
Der Code Redirect.c aus dem Link macht ja im Prinzip schon die Umleitung, doch es wird ja ein Prozess gestartet, aber bei mir läuft ja selbst der Prozess bei dem alles gespeichert werden soll. Noch eine Frage, kann ich dann normal die Daten wie immer mit cout ausgeben lassen und werden diese dann automatisch gespeichert, also muss ich mich nicht mehr darum kümmern??
-
Hast du mal das hier versucht:
system("dir > test.txt");
?
-
Nein! Es läuft eben nicht der Prozess bei Dir!
Du führst doch system aus. Das startet einen neuen Prozess! system führt am Ende auch nur CreateProcess aus!
-
Du musst cmd.exe versklaven
-
Also muss ich eine "Zwischenanwendung" schreiben die dann meine Konsole mit Pipes startet und einmal auf die Konsole ausgibt und in eine Datei speichert?
Welche der Handles aus der Redirect sind für mich relevant zum speichern in die Datei hOutputWrite und hInputWrite??
-
Wieso eine Zwischenanwendung. Erzeuge Deine Pipes in Deiner Applikation und starte die neue.
-
Hab mal das gemacht mit dem gleichen Code und die Anwendung hat sich immer selbst gestartet bis das System überlastet wurde und musste den PC ausschalten, wie kann man das verhindern?
-
Du hast Deinen Prozess selbst neu gestartet? Warum?
Ich denke Du hast einen anderen Prozess, den Du starten möchtest. Dessen Daten möchtest Du umlenken.
Also gehst Du hin (wie in dem Code dessen Link Du hast) erzeugst eine Pipe für die Ausgabe und startest diesen neuen Prozess unter der Angabe der neuen Pipes für die Ausgabe.Was ausgegeben wird in diese Pipe kanst Du nach eigenem Guitdünken verwenden.
-
Nein ich meinte eigentlich das Hauptprogramm ist die Shell, also alles was man sieht soll auch gespeichert werden nach dem WYSIWYG Prinzip.
Also wie erstelle ich von einen eigenem Prozess eine Pipe damit ich mit der Pipe einmal auf die Konsole und einmal in eine Datei schreiben kann?
Bitte mit einem Beispiel, da ich mich mit Pipes usw. nicht auskenne.