2016-11-01 1 views
1

Ich muss ein Verzeichnis festlegen und dann alle Dateinamen der Dateien im Inneren lesen und den gesamten Pfad in einer Variablen speichern. Ich muss diese Variable später verwenden, um die Datei zu öffnen und zu lesen. Ich möchte nicht QDir dafür verwenden. Ich sah die zweite Antwort auf die Frage here. Ich kann boost/filesystem.hpp verwenden (ich glaube, dass dies nicht separat heruntergeladen werden muss). Aber das Problem ist, die Ausführung wird wie folgt aussehen:Das os.path-Äquivalent in C++ ohne Qt?

$ g++ -o test test.cpp -lboost_filesystem -lboost_system 
$ ./test 

Meine erste Linie, für die Erstellung von ausführbarem Objekt ist bereits kompliziert aufgrund OpenCV-Bibliotheken und ich will nicht, um es hinzuzufügen. Ich möchte, dass sie einfach halten (die folgende Zeile und was auch immer OpenCV will):

g++ -o test test.cpp 

Gibt es eine Möglichkeit, es zu tun?

Dies ist der Python-Code für die ich mag C++ Code schreiben:

root_dir = 'abc' 
img_dir = os.path.join(root_dir,'subimages') 

img_files = os.listdir(img_dir) 
for files in img_files: 
    img_name = os.path.join (img_dir,files) 
    img = cv2.imread(img_name) 
+0

Vermeiden Sie in Erwägung ziehen könnte 'test' die ausführbare Datei. Es ist ein Standard-POSIX-Programm '/ bin/test' oder eine eingebaute Shell. Rufen Sie Ihre Testbinär 'Mytest' –

+1

Warum nicht einfach cv :: glob verwenden? – Miki

+0

@BasileStarynkevitch Ich habe 'test' von der anderen Frage kopiert, in den Link. Ich habe es einfach weiter für den Rest der Frage benutzt. –

Antwort

3

Ihre Entscheidungen sind Schub zu verwenden, QDir, rollen Sie Ihre eigenen, oder einen neuen Compiler verwenden, das einige der angenommen hat TR2-Features, die für C++ 17 bereitgestellt werden. Unten ist ein Beispiel, das ungefähr in einer systemunabhängigen Art und Weise mit der C++ 17-Funktion über Dateien iterieren sollte.

#include <filesystem> 
namespace fs = std::experimental::filesystem; 
... 
fs::directory_iterator end_iter; 
fs::path subdir = fs::dir("abc")/fs::dir("subimages"); 
std::vector<std::string> files; 

for (fs::directory_iterator dir_iter(subdir); dir_iter != end_iter; dir_iter++) { 
    if (fs::is_regular_file(dir_iter->status())) { 
    files.insert(*dir_iter); 
    } 
} 
+0

Ich denke, ich werde mit Boost gehen und eine Datei erstellen, die alles enthält, was beim Erstellen des Objekts aufgerufen werden sollte. Was halten Sie davon? –

+0

Klingt nach dem zuverlässigsten Ansatz. In ein paar Jahren wird es weniger nötig sein, ein so großes Bündel in kleine Probleme wie dieses zu tragen. – Pyrce

1

Für Linux oder POSIX ....

Sie können Low-Level verwenden nftw(3) oder opendir(3) & readdir(3) etc ... Natürlich müssen Sie mit schmutzigen Details beschäftigen (Überspringen . & .. Einträge, den Dateipfad aus dem Eintrag und dem Verzeichnispfad zusammenstellen, Fehler behandeln, etc ...). Möglicherweise benötigen Sie auch stat(2). Sie sollten Advanced Linux Programming & syscalls(2) lesen, um eine breitere Sicht zu erhalten.

Für andere Betriebssysteme (insbesondere Windows) benötigen Sie andere Low-Level-Funktionen.

BTW, können Sie den Quellcode von Qt schauen in für QDir

Sie auch POCO Benennung