[C++] Struktura do listy plików + sortowanie po dacie utworzenia
Ostatnio zmodyfikowano 2012-11-25 13:58
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: 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 ) ) { } } 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) |
|
DejaVu |
» 2012-11-25 04:21:23 Tworzysz dowolną strukturę, tworzysz w niej odpowiedni operator() i sortujesz dane przy pomocy std::sort. |
|
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. 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() ); 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(); }
|
|
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 :) |
|
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: 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(); }
|
|
« 1 » |