Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » absoluten datei-pfad sortiert auslesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.06.2010, 23:54 Uhr
nasil122002



Hallo,

Ich wollte den absoluten datei-pfad in einem Ordner sortiert auslesen(unter Linux). Auslesen die datei-pfaden ist ok aber bei der Sortierung habe ich Probleme.



C++:
    selectedDirectory = fl_dir_chooser ("Select Imagedirectory:",NULL,0); //Das ist nur ein Widget um den Ordner zu zeigen.
        
    DIR *d;
    dirent *de;
//      char pfad[256];
    numberOfFilesOnSelectedFolder= 0;
    
    d=opendir(selectedDirectory); //Hier kann man den Ordnerpfad eingeben anstatt selectedDirectory
    
    while((de=readdir(d))){
    numberOfFilesOnSelectedFolder++;
    }
    closedir(d);
    
    
    d= opendir(selectedDirectory);
    
    std::vector <std::string> result;
    
    char buffer[500];
    int n;
    
    if (d) {
    while (true) {
    de= readdir(d);
    
    if (de == NULL) break;
    n= sprintf (buffer, "%s/%s", selectedDirectory, de->d_name);
    result.push_back( std::string(buffer));
      }
    closedir(d);
    std::sort( result.begin(), result.end() );
    }

cout << "result 3:" << result.at(0) << endl << result.at(1) << endl << result.at(2) << endl << result.at(3) << endl << result.at(4) << endl << result.at(5) << endl << result.at(6) << endl;





Wenn ich diesen Code ausführe und bestimmen will, was die 0., 1., 2., 3. usw. Dateien im Ordner sind, dann bekomme ich folgende Antwort:

result 3:/home/csad6517/Desktop/ViSeCut/Neck2/.
/home/csad6517/Desktop/ViSeCut/Neck2/..
/home/csad6517/Desktop/ViSeCut/Neck2/Unbenannt-105.dcm
/home/csad6517/Desktop/ViSeCut/Neck2/Unbenannt-106.dcm
/home/csad6517/Desktop/ViSeCut/Neck2/Unbenannt-107.dcm
/home/csad6517/Desktop/ViSeCut/Neck2/Unbenannt-36.dcm
/home/csad6517/Desktop/ViSeCut/Neck2/Unbenannt-37.dcm


Die Datei -105.dcm, -106.dcm, -107.dcm liegen aber im Ordner ganz unten und -36.dcm, -37.dcm ganz oben. Das Programm vergleicht 1 und 3 von 105 und 37, da 1 kleiner als 3 ist gibt es als erstes aus, weiss aber nicht dass 105 dreistellig und 37 zweistellig ist. Was kann man da machen, damit die Reichenfolge stimmt?

Die Dateien im Ordner sehen so aus:
www.wopsys.com/bilder/dateien.jpg

Danke im Voraus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.06.2010, 08:49 Uhr
ao

(Operator)


Bei alphabetischer Sortierung muss das so rauskommen.

Du kannst entweder die Dateien umbenennen und ein einheitliches Namensschema verwenden, also so:
Unbenannt-036.dcm
Unbenannt-037.dcm
Unbenannt-105.dcm

Oder du bearbeitest die ausgelesenen Namen in deiner Software:


C++:
    de= readdir(d);
    
    if (de == NULL) break;
    {
        if (!name_enthaelt_dreistellige_nummer (de->d_name))
        {
            name_zerlegen_und_passend_formatieren (de->d_name);    
        }
        n= sprintf (buffer, "%s/%s", selectedDirectory, de->d_name);

// und weiter wie gehabt



Das ist jetzt nur eine spontan hingekritzelte Idee. Kann sein, dass das Umformatieren nicht in-place geht und dass du das auf einem Pufferspeicher machen musst, den du selber holen und am Ende wieder freigeben musst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.06.2010, 18:16 Uhr
0xdeadbeef
Gott
(Operator)


Du wirst dir dafür einen Sortierungsfunktor schreiben müssen. Der üblichste allgemeine Algorithmus für diese Art der Sortierung ist hier beschrieben, allerdings täte es für deine Zwecke wohl auch eine einfachere Abwandlung.

Danach dann halt

C++:
std::sort(result.begin(), result.end(), deine_sortierung);


wobei ich das an deiner Stelle wahrscheinlich gleich der Reihe nach in ein std::set schmeißen würde, um Zeit zu sparen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: