2013-02-11 13 views
6

Wie führe ich ein Kommandozeilenprogramm mit Argumenten aus einem C++ Programm aus? Das ist, was ich gefunden online:C++ Programm zum Ausführen eines anderen Programms mit Kommandozeilenargumenten

http://www.cplusplus.com/forum/general/15794/

std::stringstream stream; 
stream <<"program.exe "<<cusip; 
system(stream.str().c_str()); 

Aber es scheint nicht einen tatsächlichen Programmplatz zu akzeptieren, so dass ich bin nicht sicher, wie diese anzuwenden. Meine Hoffnung war, etwas wie dieses zu haben:

std::stringstream stream; 
stream <<"C:\Tests\SO Question\bin\Release\HelloWorld.exe "<<"myargument"; 
system(stream.str().c_str()); 

Dies gibt mehrere Warnungen im Zusammenhang mit den Backslashes - und das Programm funktioniert nicht. Erwartet Sie, dass Sie das Programm an einem bestimmten Ort haben?

Dies ist die Ausgabe ich in der Konsole:

‚C: \ Test‘ wird als interner oder externer Befehl nicht erkannt, bedienbare Programm oder Batch-Datei.

NACHTRAG:

So basiert auf Jon Antwort die richtige Version für mich sieht wie folgt aus:

#include <iostream> 
#include <cstdlib> 
#include <sstream> 
#include <cstring> 
int main(int argc, char *argv[]) 
{ 

std::stringstream stream;  
stream << "\"C:\\Tests\\SO Question\\bin\\Release\\HelloWorld.exe\"" 
     << " " // don't forget a space between the path and the arguments 
     << "myargument"; 
system(stream.str().c_str()); 

return 0; 
} 
+0

Jede Idee, wie stdout von System umleiten (...) std :: string oder std :: string ? – Pupsik

+1

@Pupsik Die Systemfunktion gibt einen int zurück. Anscheinend müssten Sie die Statuscodes für jedes Betriebssystem kennen, das Sie verwenden: "Wenn der Befehl kein Nullzeiger ist, hängt der zurückgegebene Wert von den System - und Bibliotheksimplementierungen ab, aber es wird im Allgemeinen der Statuscode erwartet aufgerufener Befehl, falls unterstützt. " - von http://www.cplusplus.com/reference/cstdlib/system/ - dann könnten Sie die richtige Fehlermeldung basierend auf dem zurückgegebenen Int erzeugen. – Stepan1010

+0

Was? Hast du meinen Kommentar gelesen? – Pupsik

Antwort

9

Zunächst sollten Sie doppelte Backslashes in Literalstrings verwenden, wenn Sie möchten, dass ein einzelner Backslash im tatsächlichen Zeichenfolgenwert angezeigt wird. Dies entspricht der Grammatik der Sprache; ein konformer Compiler könnte schlechter als einfach Warnung über dies tun.

In jedem Fall besteht das Problem darin, dass Pfade, die Leerzeichen enthalten, in Anführungszeichen in Windows eingeschlossen sein müssen. Da die doppelten Anführungszeichen brauchen, um sich in einem C++ Stringliteral entkommen sein, was Sie brauchen, zu schreiben, ist

stream << "\"C:\\Tests\\SO Question\\bin\\Release\\HelloWorld.exe\"" 
     << " " // don't forget a space between the path and the arguments 
     << "myargument"; 
+0

Danke Jon. Dies löst das Problem. – Stepan1010

5

Diese auf die Schrägstriche im Zusammenhang mehrere Warnungen gibt

Ich glaube, \ ist ein Escape-Zeichen in C++ mit \\ stattdessen wird wahrscheinlich dieses Problem lösen.

+1

Auch Ihr Code wird die Zeichenfolge "myarguments" statt einer var mit dieser Informationen wie geschrieben übergeben - was sein kann wie beabsichtigt. –

Verwandte Themen