[Erledigt] mkdir() erstellt unerklärliche Ordnernamen
-
Hallo Leute,
mein Programm soll mehrere Ordner erstellen und der Ordnername soll hierbei dynamisch generiert werden. z.B.:
/bla/23-11-15test1
/bla/23-11-15test2
/bla/23-11-15test3Falls schon 3 Ordner vorhanden sind, soll der nächste erstellte Ordner mit einer 4 enden. Mein Code dazu sieht wie folgt aus.
string ordnerPfad = "/bla/" + zeit.getDatum() + "test" + ordnerAnzahl(); cout << ordnerPfad << endl; mkdir(ordnerPfad.c_str(), 0777);Wenn ich das Programm ausführe, gibt mir cout stets den gewünschten Ordnerpfad an, jedoch werden andere Ordnernamen erstellt, die alle eine Fragezeichen hinten am Namen angehängt haben.
/bla/23-11-15test1?
/bla/23-11-15test2?
/bla/23-11-15test3?Könnt ihr mir weiterhelfen? Ich nutze Linux und Code::Blocks.
Danke schonmal im Voraus.
-
Wahrscheinlich ein Problem mit
ordnerAnzahl(), oder?
-
Dachte ich auch, aber warum gibt mir die Ausgabe die richtige Anzahl ohne Fragezeichen? Hier ist mal meine orderAnzahl() Methode. Mir ist auch noch etwas komisches aufgefallen und zwar sobald der erste Ordner durch die Methode erstellt wurde, gibt der Shell Befehl eine falsche Orderanzahl zurück.
string ausgabe: ostringstream oss; FILE* in; char buff[512]; if((in = popen("ls -l /bla/ | wc -l", "r"))) { while(fgets(buff, sizeof(buff), in) != NULL) { oss << buff; } pclose(in); ausgabe = oss.str(); } else { // Fehler } return ausgabe;
-
Bitte ausführbares Minimalbeispiel, das den Fehler demonstriert.
-
// Log.cpp #include "Log.h" void Log::ordnerErstellen() { string ordnerPfad = "/home/pi/Logs/" + "Flug" + ordnerAnzahl(); cout << ordnerPfad.c_str(); mkdir(ordnerPfad.c_str(), 0777); } string Log::ordnerAnzahl() { string ausgabe; ostringstream oss; FILE* in; char buff[512]; if((in = popen("ls -l /home/pi/Logs/ | wc -l", "r"))) { while(fgets(buff, sizeof(buff), in) != NULL) { oss << buff; } pclose(in); ausgabe = oss.str(); } else { cout << "Fehler"; } return ausgabe; }// Log.h #ifndef LOG_H #define LOG_H #include <iostream> #include <sstream> #include <string> #include <stdio.h> #include <sys/stat.h> using namespace std; class Log { public: void ordnerErstellen(); private: string ordnerAnzahl(); }; #endif // LOG_H
-
Ohne Deinen Code ausprobiert zu haben:
Es sieht so aus, als obls -l | wc -leinen Zeilenumbruch einfügt - jedenfalls springt die bash bei mir in die näxte Zeile.Sorry für den Schnellschuß, aber ich will in's Bett!

-
Danke für deine fixe Antwort

Ich bin leider noch nicht so vertraut mit Linux, versuche mich gerade auf dem Raspberry. Wie lässt sich der Umbruch verhindern, falls es das sein sollte?
-
ghorki schrieb:
Wie lässt sich der Umbruch verhindern, falls es das sein sollte?
Schneide ihn halt ab.
-
Das ist des Rätsels Lösung.
Danke an euch! Ihr rettet mir den Abend
-
Es ist fast nie eine gute Idee, die Ausgabe von ls zu parsen. ls ist primär für menschliche Leser gedacht. Im konkreten Fall hier fallen mir beispielsweise spontan folgende Fehlerquellen ein:
-ls kann fehlschlagen bei sehr vielen Dateien.
-Dateinamen in Unix können viele verrückte Zeichen enthalten, unter anderem auch Zeilenumbrüche.
Und es gibt sicher noch mehr, die mir gerade nicht einfallen.Besser wäre es, mit readdir selber die Dateien zu zählen. Oder boost::Filesystem benutzen.
-
Danke, dann werde ich mir das mal genauer anschauen.