String mit Teilen durch "\n" getrennt in system() ausführen
-
Wenn ich mich nicht irre, funktioniert system() auch nur auf Windows.
-
FreakY<3Cpp schrieb:
Wenn ich mich nicht irre, funktioniert system() auch nur auf Windows.
Nicht. http://www.cplusplus.com/reference/clibrary/cstdlib/system/
-
Eigentlich eine ganz einfache Sache...
#include <sstream> #include <string> #include <iostream> int main() { std::string str = "mspaint.exe\nnotepad.exe\ncmd.exe"; std::stringstream ss(str); if(!ss) { // Fehler... } std::string cmd; while(ss >> cmd) system(cmd.c_str()); }
-
returning an int value, whose interpretation is system-dependent.
-
... std::stringstream ss(str); ...Dankeschön! Mein Compiler sagt dazu aber:
error: variable `std::stringstream ss' has initializer but incomplete type
-
Uups, hab vergessen <sstream> zu includieren. Nehme alles zurück.
-
Ad aCTa schrieb:
Eigentlich eine ganz einfache Sache...
#include <sstream> #include <string> #include <iostream> int main() { std::string str = "mspaint.exe\nnotepad.exe\ncmd.exe"; std::stringstream ss(str); if(!ss) { // Fehler... } std::string cmd; while(ss >> cmd) system(cmd.c_str()); }Hab grad bemerkt, dass ich damit kein "echo bla" machen kann.

Er führt sowohl "echo" als auch "bla" als Befehl aus.
-
Es könnte helfen, die Befehle nicht durch \n zu trennen.
-
Also bei mir geht das so:
#include <string> #include <stdlib.h> int main(int argc, char* argv[]) { std::string cmd = "ifconfig\neth0"; std::string::size_type p; while ( (p = cmd.find('\n')) != std::string::npos) cmd[p] = ' '; system(cmd.c_str()); }Ich habe übrigens Linux.
-
Die Befehle werden Zwangsweise durch \n getrennt, da ich sie aus einer Textdatei lese. Ich habe das Beispiel nur aufs Wesentliche beschränkt.
-
MitNase schrieb:
Die Befehle werden Zwangsweise durch \n getrennt, da ich sie aus einer Textdatei lese. Ich habe das Beispiel nur aufs Wesentliche beschränkt.
Dann lies sie anders aus der Textdatei. Du hast sie nicht aufs wesentliche beschränkt sondern noch weiter, das Detail mit der Textdatei wäre wichtig gewesen.
Siehe den Link in meiner Signatur, Teil "Sag was du erreichen willst, nicht wie du es erreichen willst".
Was du erreichen willst wäre hier gewesen "ich will einzelne Zeilen einer Textdatei als Shellkommandos (Win und Linux) ausführen."
-
pumuckl schrieb:
MitNase schrieb:
Die Befehle werden Zwangsweise durch \n getrennt, da ich sie aus einer Textdatei lese. Ich habe das Beispiel nur aufs Wesentliche beschränkt.
Dann lies sie anders aus der Textdatei. Du hast sie nicht aufs wesentliche beschränkt sondern noch weiter, das Detail mit der Textdatei wäre wichtig gewesen.
Siehe den Link in meiner Signatur, Teil "Sag was du erreichen willst, nicht wie du es erreichen willst".
Was du erreichen willst wäre hier gewesen "ich will einzelne Zeilen einer Textdatei als Shellkommandos (Win und Linux) ausführen."Ok, tut mir leid.
Weißt du trotzdem wie ich meinen String, den ich bereits aus der Textdatei gelesen hab ausführen kann?
-
#include <fstream> #include <string> #include <iostream> int main() { std::ifstream ifs("commands.txt", std::ios_base::binary); if(!ifs) { // Fehler... } std::string cmd; while(std::getline(ifs, cmd)) system(cmd.c_str()); }Wo ist denn das Problem?
-
Ad aCTa schrieb:
Wo ist denn das Problem?
Wahrscheinlich ganz einfach. Ein std::system Aufruf blockiert, bis das Programm fertig ist, welches ausgeführt wurde.
Anders gesagt, werden die Programme nacheinander ausgeführt und nicht gleichzeitig gestartet.Grüssli
-
Ad aCTa schrieb:
#include <fstream> #include <string> #include <iostream> int main() { std::ifstream ifs("commands.txt", std::ios_base::binary); if(!ifs) { // Fehler... } std::string cmd; while(std::getline(ifs, cmd)) system(cmd.c_str()); }Wo ist denn das Problem?
Danke für deine Hilfe. Das Problem ist, dass die Datei schon als String gebuffert ist. Aus einer anderen Quelle. Ansonsten müsste ich die den Inhalt des Strings als Datei speichern und anschließend wieder öffnen.
-
Und wieso ist das ein Problem, dass du die Kommandos als String hast?
-
MitNase schrieb:
Danke für deine Hilfe. Das Problem ist, dass die Datei schon als String gebuffert ist. Aus einer anderen Quelle. Ansonsten müsste ich die den Inhalt des Strings als Datei speichern und anschließend wieder öffnen.
Du kannst auch einen
istringstreamverwenden:#include <string> #include <sstream> int main() { std::string buffer = "hello\nworld\nthis\nwhatever"; std::istringstream iss(buffer); std::string line; while(std::getline(iss, line)) { // mach was mit line ... } return 0; }Könntest das ganze natürlich auch in Tokens aufteilen mit
std::string::findundstd::string::substr.Grüssli
-
SeppJ schrieb:
Und wieso ist das ein Problem, dass du die Kommandos als String hast?
Dass getline char verlangt.
-
MitNase schrieb:
SeppJ schrieb:
Und wieso ist das ein Problem, dass du die Kommandos als String hast?
Dass getline char verlangt.
Nicht wenn du die freie
std::getlineFunktion verwendest, welche sich im Header <string> befindet.Grüssli
-
Dravere schrieb:
MitNase schrieb:
Danke für deine Hilfe. Das Problem ist, dass die Datei schon als String gebuffert ist. Aus einer anderen Quelle. Ansonsten müsste ich die den Inhalt des Strings als Datei speichern und anschließend wieder öffnen.
Du kannst auch einen
istringstreamverwenden:#include <string> #include <sstream> int main() { std::string buffer = "hello\nworld\nthis\nwhatever"; std::istringstream iss(buffer); std::string line; while(std::getline(iss, line)) { // mach was mit line ... } return 0; }Könntest das ganze natürlich auch in Tokens aufteilen mit
std::string::findundstd::string::substr.Grüssli
Endlich mal was, was funktioniert! Tausend++ Dank!