String mit Teilen durch "\n" getrennt in system() ausführen



  • 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.


  • Mod

    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?


  • Administrator

    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.


  • Mod

    Und wieso ist das ein Problem, dass du die Kommandos als String hast?


  • Administrator

    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 istringstream verwenden:

    #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::find und std::string::substr .

    Grüssli



  • SeppJ schrieb:

    Und wieso ist das ein Problem, dass du die Kommandos als String hast?

    Dass getline char verlangt.


  • Administrator

    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::getline Funktion 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 istringstream verwenden:

    #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::find und std::string::substr .

    Grüssli

    Endlich mal was, was funktioniert! Tausend++ Dank!


Anmelden zum Antworten