Verzeichnisreihenfolge beim Auslesen mit boost

Hallo,

Ich baue gerade einen Klassifikator, der mit den Daten aus einem ersten Verzeichnis trainiert werden soll und mit den Daten aus einem anderen evaluiert. Die Daten zu den Klassen liegen jeweils in einem Ordner. Jede Klasse wird mit einem integer identifiziert, also:
./train/aepfel => 0
./train/birnen => 1
./train/tomaten => 2
und
./test/aepfel => 0
./test/birnen => 1
./test/tomaten => 2

Wenn ich aber boost verwende, um die Verzeichnisse train und test auszulesen, werden die Unterverzeichnisse in einer fuer mich voellig zufaelligen Art durchlaufen, so dass die Zuordnung der integer fuer test und train nicht die gleiche ist. Weiss jemand, in welcher Reihenfolge durch die Unterverzeichnisse iteriert wird? Bis jetzt verwende ich einfach nur

for( directory_iterator iter(path(source, no_check)) ; iter != end ; ++iter ) {
lies den verzeichnisnamen und lege Klasse i an
}

Ganz vielen Dank!
chris

Hallo,

Weiss jemand, in welcher Reihenfolge durch die
Unterverzeichnisse iteriert wird? Bis jetzt verwende ich
einfach nur

> for( directory\_iterator iter(path(source, no\_check)) ; iter !=  
> end ; ++iter ) {  
> lies den verzeichnisnamen und lege Klasse i an  
> }

Vermutlich werden die Verzeichnisse in der Reihenfolge gelesen, in der sie in der Index-Tabelle deines Dateisystems stehen (weil das am effizientesten ist).

Wenn du Untervzeichnisse sortiert haben willst, musst du sie halt sortieren (es sei denn, der directoy_iterator hat Sortierungsoptionen, dann kannst du die Arbeit an den Iterator abgeben).

Grüße,
Moritz

Hallo,

Ich baue gerade einen Klassifikator, der mit den Daten aus
einem ersten Verzeichnis trainiert werden soll und mit den
Daten aus einem anderen evaluiert. Die Daten zu den Klassen
liegen jeweils in einem Ordner. Jede Klasse wird mit einem
integer identifiziert, also:
./train/aepfel => 0
./train/birnen => 1
./train/tomaten => 2
und
./test/aepfel => 0
./test/birnen => 1
./test/tomaten => 2

Wenn ich aber boost verwende, um die Verzeichnisse train und
test auszulesen, werden die Unterverzeichnisse in einer fuer
mich voellig zufaelligen Art durchlaufen, so dass die
Zuordnung der integer fuer test und train nicht die gleiche
ist. Weiss jemand, in welcher Reihenfolge durch die
Unterverzeichnisse iteriert wird?

Das ist nicht vorhersehbar und es gibt afaik auch keine
„interne Sortierung“ im Iterator. (Wie soll das auch gehen?)

Wie Moritz schon erklärt hat besteht die Lösung ganz einfach
im Schreiben einer kleinen Funktion, die das Verzeichnis erstmal
einliest und die Dateinamen sortiert zurückliefert, also etwa
sowas:

 int ls\_1(const char \*directory, std::vector& files, bool sort=true)
{
 using namespace boost::filesystem;
 path here( system\_complete(path(directory, native)) );

 if( exists(here) && is\_directory(here) ) {
 for(directory\_iterator dirh(here), end; dirh!=end; ++dirh) 
 if( is\_regular(dirh-\>status()) ) 
 files.push\_back( dirh-\>leaf() );
 if(sort) 
 std::sort(files.begin(), files.end());
 }
 return files.size();
}

welches dann z.B. über:

 using namespace std;
 ...
 vector files;

 ls\_1(verzeichnisname, files);
 cout 

jeweils aufgerufen wird. Danach hättest Du die
Namen in einer vernünftigen Reihenfolge (die
durch die Sortierung bestimmt ist).

Grüße

CMБ