ubuntuusers.de

System Befehl in C++ läuft nicht wie in der Kommandozeile

Status: Ungelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

jolle-pe

Avatar von jolle-pe

Anmeldungsdatum:
20. Juni 2008

Beiträge: 266

Wohnort: Peine

Hallo,

ich habe folgendes Problem in C++. Ich möchte ein paar Kommandobefehle über system() ausgeben. Jedoch funktionieren die nicht so, wie man es von der direkten Kommandozeile her kennt.

Ich möchte im Programm ein paar Werte aus einer sqlite3 Datenbank auslesen und in eine Datei schreiben. Anschließend sollen die Daten geplottet werden. Keine sehr schöne Lösung, aber es soll erstmal grundsätzlich funktionieren 😉

1
2
3
4
5
    string StrOutput = "sqlite3 test.db 'select date, time, tempin, tempout, humidity from messwerte where datetime between \"2015-01-16 16:00:00\" AND \"2015-01-18 18:00:00\" ' > test.txt";
    cout << StrOutput;
    system(("'"+StrOutput+"'").c_str());
    system ("gnuplot < einstellungen.plt");
    system ("rm test.txt");

Wenn ich das mit meinem Programm drum herum kompiliere, erhalte ich immer die Fehlermeldung:

sh: 1: sqlite3 test.db select: not found
         line 0: warning: Skipping unreadable file "test.txt"
         line 0: warning: Skipping unreadable file "test.txt"
         line 0: warning: Skipping unreadable file "test.txt"
         line 0: No data in plot

rm: das Entfernen von »test.txt“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden
sqlite3 test.db 'select date, time, tempin, tempout, humidity from messwerte where datetime between "2015-01-16 16:00:00" AND "2015-01-18 18:00:00" ' > test.txt

Wenn ich aber meinen erzeugten Kommandozeilenbefehl:

sqlite3 test.db 'select date, time, tempin, tempout, humidity from messwerte where datetime between "2015-01-16 16:00:00" AND "2015-01-18 18:00:00" ' > test.txt

direkt so in der Kommandozeile ausführe, dann funktioniert alles wie gewollt.

Hat jemand eine Idee? Ich befürchte, dass es an der Zeile hängt, in der ich der system() Funktion den fertig gebauten String mit der Abfrage übergebe.

Gruß Julian

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

jolle-pe schrieb:

Hat jemand eine Idee? ...

Jaaa ... Du benutzt eine Datei-Umleitung ( > ), aber die ist kein ausführbares Programm. sondern Bestandteil der Shell !
Die hast Du von system() aus aber gar nicht aufgerufen, folglich existiert sie auch nicht.

Das musst Du also anders machen:
entweder, du rufst tatsächlich eine komplette Shell auf, der Du Deinen Befehl als Parameter mitgibst, (Welch ein Graus ! - aber gehen tut das.)
oder, Du schreibst die Daten selber in die betreffende Datei, innerhalb Deines C++- Programms. (was schon besser wäre)
So richtig professionell wäre es, wenn Du alles mit Bibliotheksfunktionen machst, und gar keine system()- Aufrufe mehr brauchst.

LG,

track

jolle-pe

(Themenstarter)
Avatar von jolle-pe

Anmeldungsdatum:
20. Juni 2008

Beiträge: 266

Wohnort: Peine

Hallo Track,

der Umleitungsoperator ist aber auch aus C++ aufrufbar. Habe somit schon so manche Hilfskrücke geschmiedet 😊

Habe meinen Fehler gefunden. So ist der system() Aufruf korrekt:

1
system((StrOutput ).c_str());

Danke und Gruß Julian

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13224

jolle-pe schrieb:

So ist der system() Aufruf korrekt:

1
system((StrOutput ).c_str());

Ich sehe da noch ein überflüssiges Klammernpaar. ☺

track schrieb:

So richtig professionell wäre es, wenn Du alles mit Bibliotheksfunktionen machst, und gar keine system()- Aufrufe mehr brauchst.

Sehe ich auch so. Ich denke, das wäre außerdem robuster. Oder man geht in die andere Richtung und macht es gleich als Shell-Skript o.ä.

Ciao

robert

Antworten |