Ausgabe in String umleiten



  • Ich starte über ein c++ Programm ein Tool des Android SDKs. Dieses
    gestartete Tools gibt fleissig output in die Konsole. Diesen output
    würde ich nun gerne in meinem Programm als String weiter verarbeiten.

    Bisher kam ich mit der PStream Lib ganz gut aus. Dieses Beispiel hier gibt mir den kompletten output des gestarteten Programms zurück.

    std::string s, ausgabe;
    chdir(path_to_adb.c_str());
    redi::pstream adb_shell("./adb shell");
    adb_shell << "mount /system" << std::endl;
    adb_shell << "chmod 644 /system/app/*" << std::endl;
    adb_shell << "chmod 644 /system/framework/*" << std::endl;
    adb_shell << "exit" << std::endl;
    while(std::getline(adb_shell, s)) {
       ausgabe.append(s);
       ausgabe.append("\n");
       }
    textview_buffer->set_text(ausgabe);
    

    Möchte ich jetzt nicht die adb shell über mein Programm starten, sondern nur eine Datei auf das Android Device kopieren kommt das Programm adb push zum Einsatz. Wenn ich dieses jedoch mit der PStream Lib starte, gibt es mir nichts zurück, obwohl adb push ebenfalls Infos über die kopierten Dateien und die Dauer des kopierens in die Konsole ausgibt.

    std::string s, ausgabe;
    chdir(path_to_adb.c_str());  
    redi::pstream adb_pull("./adb pull /system/app /home/dir/");
    while(std::getline(adb_pull, s)) {
      ausgabe.append(s);
      ausgabe.append("\n");
    }
    textview_buffer->set_text(ausgabe);
    

    Das obige Beispiel funktioniert nicht und der String Ausgabe bleibt leer. Obwohl in der Konsole die Operationen nach folgendem Schema durchrattern.

    Kopierte Datei: 1985 KB/s (203484 bytes in 0.100s)

    Welche Möglichkeiten habe ich an den Inhalt der Konsole zu kommen wenn mir die PStream Lib nichts rausrückt aber in der Standard Konsole etwas zurück gegeben wird?



  • hat niemand eine idee wie ich an den konsolenoutput komme?
    oder fehlen noch informationen?



  • am einfachsten geht es eigtl über die pipe.

    "program > output_cout"
    erstellst halt davor ne datei und gibst deren name dann dort an. und danach liest du sie wieder aus.
    ob es noch eine bessere möglichkeit innerhalb des frameworks gibt, weiß ich nicht.

    bb



  • cardex schrieb:

    hat niemand eine idee wie ich an den konsolenoutput komme?
    oder fehlen noch informationen?

    ich habe keine Ahnung was die PStream Lib macht, aber möglicherweise schreibt das eine Programm nach stdout und das andere nach stderr.

    Lars



  • cardex schrieb:

    hat niemand eine idee wie ich an den konsolenoutput komme?
    oder fehlen noch informationen?

    versuchs mit:

    #include <string>
    #include <sstream>
    
    template <typename T>
    std::string toString(T obj){
    	std::stringstream ss;
    	ss << obj;
    	return ss.str();
    }
    

    Ich bastel mir bei bedarf immer etwas daraus zusammen.



  • danke erstmal für die antworten.

    ich werde aus den ausgaben bzw wo sie hingeschrieben werden nicht schlau. pipe ich den output in eine datei, steht nach dem ausführen folgender inhalt in der datei.

    * daemon not running. starting it now *
    * daemon started successfully *

    und das wars. der konsolenoutput ist jedoch (gekürzt, und direkt per konsole gestartet):

    $ adb pull /system/app /home/andre/milestone > /home/andre/output

    pull: building file list...
    pull: /system/app/GenieWidget.apk -> /home/andre/milestone/GenieWidget.apk
    pull: /system/app/Gmail.apk -> /home/andre/milestone/Gmail.apk

    76 files pulled. 0 files skipped.
    1862 KB/s (38668052 bytes in 20.274s)

    es ist also eine völlig andere ausgabe. kann sich da jemand einen reim raus machen?

    @darkfate
    dein beispiel sagt mir leider nichts. kannst du viellicht ein wenig ausführen was der code machen soll?



  • und was steht in den beiden Dateien, wenn du es so

    $adb pull /system/app /home/andre/milestone > /home/andre/output 2>/home/andre/errorout

    aufrufst?

    Lars



  • cardex schrieb:

    @darkfate
    dein beispiel sagt mir leider nichts. kannst du viellicht ein wenig ausführen was der code machen soll?

    So in etwa, ohne jegliche Typprüfung/Sicherheit.

    template <typename T>
    std::string toString(T obj){
        std::stringstream ss;
        ss << obj;
        return ss.str();
    } 
    std::stringstream tmp;
    std::string s, ausgabe;
    chdir(path_to_adb.c_str());  
    redi::pstream adb_pull("./adb pull /system/app /home/dir/");
    while(std::getline(adb_pull, tmp){
      ausgabe.append(toString(tmp));
      ausgabe.append("\n");
    }
    textview_buffer->set_text(ausgabe);
    


  • bingo, jetzt ist die datei output leer und der gesamte konsolenoutput steht in der errorout. das programm schreibt also in cerr?

    //edit, gut den rest bekomme ich alleine raus. danke für eure hilfe!


Log in to reply