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

[C++] Wyświetlanie wybranych plików w oknie dialogowym

Ostatnio zmodyfikowano 2016-12-15 21:54
Autor Wiadomość
marianekA
Temat założony przez niniejszego użytkownika
[C++] Wyświetlanie wybranych plików w oknie dialogowym
» 2016-12-13 19:37:01
Poniższa funkcja wczytuje wszystkie pliki z bieżącego katalogu.
Chcę by wczytywała tylko pliki graficzne.
Z jednym rozszerzeniem  np. "*.jpg" jest OK,
wstyd się przyznać ale nie wiem jak wstawić ich kilka.

C/C++
int id = 0;
string dir[ 99 ];

struct _finddata_t c_file;
intptr_t hFile;
// Find first .c file in current directory
if(( hFile = _findfirst( "*.*", & c_file ) ) == - 1L )
     printf( "No *.c files in current directory!\n" );
else
{
    while( _findnext( hFile, & c_file ) == 0 )
    {
        char buffer[ 30 ];
        ++id;
        dir[ id ] = c_file.name;
        cout << id << endl;
    }
    _findclose( hFile );
}
P-154870
Monika90
» 2016-12-13 20:06:52
Trzeba samemu sprawdzać rozszerzenie pliku.

No i w C++ masz wektor i filesystem i w ogóle
C/C++
#include <iostream>
#include <iterator>
#include <algorithm>
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
//albo zamiast boost
//#include <experimental/filesystem>
//namespace fs = std::experimental::filesystem;


int main()
{
    auto is_image =[]( const auto & entry )
    {
        const char * const images[] = { ".jpg", ".jpeg", ".bmp", ".png" };
        return std::find( std::begin( images ), std::end( images ), entry.path().extension() ) != std::end( images );
    };
   
    for( const auto & entry: fs::directory_iterator( "c:/images" ) )
    {
        if( !is_directory( entry ) && is_image( entry ) )
             std::cout << entry << std::endl;
       
    }
}
P-154871
marianekA
Temat założony przez niniejszego użytkownika
» 2016-12-13 20:22:54
Pani Moniko, chodziło mi tylko o to czy w miejscu
hFile = _findfirst( "*.*", & c_file ) );

można użyć tylko jednego flltra (tak to się pewnie nazywa)
czy można też kilka.
P-154872
Monika90
» 2016-12-13 20:35:00
Tam można użyć gwiazdek i znaków zapytania jak w poleceniu dir, więc niewiele da się z tym zrobić. Dlatego trzeba ręcznie z nazwy wydobyć rozszerzenie i porównać z wszystkimi interesującymi przypadkami.
P-154873
marianekA
Temat założony przez niniejszego użytkownika
» 2016-12-13 20:38:55
Rozumiem... znaczy się nie da się tak prosto jak myślałem.
Pozostaje jedynie wczytanie wszystkich i za radą sprawdzanie.
Dziękuję za zainteresowanie.
P-154874
Monika90
» 2016-12-13 20:44:49
W c++ są też wyrażenia regularne, można je wykorzystać do sprawdzenia czy nazwa pliku kończy się interesującym nas rozszerzeniem, to rozwiąże problem z małymi i dużymi literami w rozszerzeniu pliku.
P-154875
marianekA
Temat założony przez niniejszego użytkownika
» 2016-12-15 21:54:55
Za radą Moniki zrobiłem tak i jest OK
C/C++
int id = 0; // numer pliku
string dir[ 99 ]; // lista plików
string ab = "", plik = "";
// --- funkcja odczytująca pliki ---
struct _finddata_t c_file;
intptr_t hFile;
hFile = _findfirst( "*.*", & c_file );
while( _findnext( hFile, & c_file ) == 0 )
{
    plik = c_file.name;
    if( plik.size() > 4 ) ab = plik.substr( plik.size() - 3, 3 );
   
    if( ab == "jpg" || ab == "JPG" || ab == "png" || ab == "PNG" || ab == "pcx" || ab == "PCX" || ab == "bmp" || ab == "BMP" )
         ++id, dir[ id ] = plik;
   
}
_findclose( hFile );
 
P-155017
« 1 »
  Strona 1 z 1