Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Struktura do listy plików + sortowanie po dacie utworzenia

Ostatnio zmodyfikowano 2012-11-25 13:58
Autor Wiadomość
potoq1
Temat założony przez niniejszego użytkownika
[C++] Struktura do listy plików + sortowanie po dacie utworzenia
» 2012-11-25 00:27:00
Witam. Wyszukuje listę plików(.mp3) w katalogu w taki sposób:
C/C++
DIR * katalog = opendir( "./mp3/" );
struct dirent * pliki = 0;
string plik;
while( pliki = readdir( katalog ) )
{
    plik = pliki->d_name;
    if( plik.find( ".mp3" ) ==( plik.length() - 4 ) ) {
       
        //dodanie do struktury?
       
    }
}
closedir( katalog );
Chciałbym dodać każdy znaleziony plik do jakiejś struktury, posortować ją według czasu utworzenia pliku, a następnie zapisać do pliku posortowaną listę plików.

Jakiej struktury najlepiej użyć?

W GCC jest funkcja scandir(), lecz ja muszę to napisać pod win32(mingw)
P-69833
DejaVu
» 2012-11-25 04:21:23
Tworzysz dowolną strukturę, tworzysz w niej odpowiedni operator() i sortujesz dane przy pomocy std::sort.
P-69835
potoq1
Temat założony przez niniejszego użytkownika
» 2012-11-25 13:05:48
Ok. Mam taki kod. Nie wiem jak teraz posortować wg dat. Coś jest źle w funkcji sortOnDate.

C/C++
struct Pliki {
    std::string nazwa;
    time_t czas;
};
bool sortOnDate( const Pliki & fA, const Pliki & fB ) {
   
    time_t czas1, czas2;
    czas1 = fA.czas;
    czas2 = fB.czas;
    if( czas1 < czas2 ) return 1;
    else if( czas1 > czas2 ) return - 1;
    else return 0;
   
}
int main() {
    std::vector < Pliki > allFiles;
    Pliki f;
    string NAGRANIA_DIR = "./nagrania";
    DIR * katalog = opendir( NAGRANIA_DIR.c_str() ); //<sciezka> zamieniamy na ścieżkę do katalogu
    struct dirent * pliki_ile = 0;
   
    string plik;
    while( pliki_ile = readdir( katalog ) ) {
        plik = pliki_ile->d_name;
        if( plik.find( ".mp3" ) ==( plik.length() - 4 ) )
        {
           
            time_t czas1;
            struct stat statInfo;
            stat( plik.c_str(), & statInfo );
            czas1 = statInfo.st_mtime;
            f.nazwa = plik;
            f.czas = czas1;
            allFiles.push_back( f );
           
        }
    }
    closedir( katalog );
   
    int max =( int ) allFiles.size();
   
    for( int i = 0; i < max; i++ ) {
        cout << allFiles[ i ].nazwa.c_str() << endl;
       
    }
   
    std::sort( allFiles.begin(), allFiles.end(), sortOnDate );
   
    cout << "po sortowaniu" << endl;
    for( int i = 0; i < max; i++ ) {
        cout << allFiles[ i ].nazwa.c_str() << endl;
       
    }
    getch();
}
P-69841
crash
» 2012-11-25 13:21:18
Poczytaj jak działa std::sort oraz jak przeciąża się operatory (wewnątrz struktur/klas), w tym wypadku chodzi o operator(). Jesteś na dobrej drodze :)
P-69843
potoq1
Temat założony przez niniejszego użytkownika
» 2012-11-25 13:58:41
Bardzo dziękuje za naprowadzanie :)

Po drobnych poprawkach kod wygląda tak:
C/C++
struct Pliki {
    std::string nazwa;
    time_t czas;
    bool operator ()( const Pliki & fA, const Pliki & fB ) const {
        if( fA.czas > fB.czas ) return true;
       
       
        return false;
    }
};

int main() {
    std::vector < Pliki > allFiles;
    Pliki f;
    string NAGRANIA_DIR = "./nagrania";
    DIR * katalog = opendir( NAGRANIA_DIR.c_str() );
    struct dirent * pliki_ile = 0;
   
    string plik;
    while( pliki_ile = readdir( katalog ) ) {
        plik = pliki_ile->d_name;
        if( plik.find( ".mp3" ) ==( plik.length() - 4 ) ) {
           
            char nagraniePlik[ 100 ];
            time_t czas1;
            struct stat statInfo;
            sprintf( nagraniePlik, "%s/%s", NAGRANIA_DIR.c_str(), plik.c_str() );
            stat( nagraniePlik, & statInfo );
            czas1 = statInfo.st_mtime;
            f.nazwa = plik;
            f.czas = czas1;
            allFiles.push_back( f );
           
           
        }
    }
    closedir( katalog );
   
    int max =( int ) allFiles.size();
   
   
    for( int i = 0; i < max; i++ ) {
        cout << allFiles[ i ].nazwa.c_str() << " ";
        struct tm * clock;
        clock = gmtime( &( allFiles[ i ].czas ) );
       
        char nagranieCzas[ 100 ];
        sprintf( nagranieCzas, "nagrano %02d/%02d/%d, o godzinie %02d:%02d", clock->tm_mday, clock->tm_mon + 1, clock->tm_year + 1900, clock->tm_hour + 1, clock->tm_min );
        cout << nagranieCzas << endl;
        cout << endl;
       
    }
   
    std::sort( allFiles.begin(), allFiles.end(), Pliki() );
   
    cout << "po sortowaniu" << endl;
    for( int i = 0; i < max; i++ ) {
        cout << allFiles[ i ].nazwa.c_str() << " ";
        struct tm * clock;
        clock = gmtime( &( allFiles[ i ].czas ) );
       
        char nagranieCzas[ 100 ];
        sprintf( nagranieCzas, "nagrano %02d/%02d/%d, o godzinie %02d:%02d", clock->tm_mday, clock->tm_mon + 1, clock->tm_year + 1900, clock->tm_hour + 1, clock->tm_min );
        cout << nagranieCzas << endl;
        cout << endl;
       
    }
    getch();
}
P-69848
« 1 »
  Strona 1 z 1