CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Szybkie porównanie rozszerzenia pliku

Szybkie porównanie rozszerzenia pliku

dział ogólny

Szybkie porównanie rozszerzenia pliku

Nowy postprzez Norbit » niedziela, 23 października 2016, 13:48

Pobrałem z pliku rozszerzenie, teraz chciałbym je szybko porównać ze wzorcem. We wzorcu mam kilka rozszerzeń, np: "jpg;jpeg;tif;tiff;png;psd". Mam kilka pomysłów, ale polegają one na porównywaniu aktualnego rozszerzenia kolejno z każdym elementem tablicy ze wzorcem. Czy istnienie jakiś szybszy sposób?
Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez polymorphism » niedziela, 23 października 2016, 14:15

Wrzuć rozszerzenia do kontenera std::set i użyj metody find.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez Norbit » niedziela, 23 października 2016, 15:08

Nie znam. Jakiś prosty przykład?
Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez polymorphism » niedziela, 23 października 2016, 18:06

C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez Norbit » niedziela, 30 października 2016, 11:48

Po raz kolejny podałeś niesprawdzony przykład. Próbowałem zrobić dokładnie to co podane jest w tym linku i otrzymuję komunikat błędu:


[BCC32 Error] Main.cpp(49): E2131 Objects of type 'set<int,less<int>,allocator<int> >' cannot be initialized with { }

Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez polymorphism » niedziela, 30 października 2016, 12:19

Haha, niesprawdzony przykład? Przykład jest jak najbardziej ok, tylko Ty używasz starego rupiecia, dlatego masz problemy z kompilacją - pisałem Ci już, że będą dziać się tego typu rzeczy nawet z prostymi kodami napisanymi we współczesnym C++. Sprawdź na stronie producenta, czy nie ma jakichś łat do twojego środowiska uaktualniających nieco kompilator.

Błąd dotyczy sposobu inicjalizacji kontenera. Standard z '03 roku nie pozwala na coś takiego. Do tego co chcesz zrobić i tak prawdopodobnie będziesz musiał użyć metody set::insert.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez Norbit » niedziela, 30 października 2016, 12:23

Próbuję z vector, ale nie idzie mi z Unicode i find:

KOD cpp:     UKRYJ  
BOOL __fastcall TForm1::CheckExt(String FileName)
{
  String sExt = ExtractFileExt(FileName);
  ShowMessage(sExt);
  String aTab[] = {"png", "jpg", "jpg", "tif", "tiff", "bmp", "psd"};

  vector< vector<String> > sTab;
  sTab.push_back( vector<String>(aTab, aTab + sizeof(aTab)/ sizeof(aTab[0])) );


  if( find( sTab.begin(), sTab.end(), sExt) != sTab.end() ) return true;

 return false;
}


Niestety to całe find nie chce działać prawidłowo. Jakiś pomysł.

To, że używam starszych bibliotek nie oznacza przecież, że nie da się tego jakoś zrobić, prawda?
Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez Norbit » niedziela, 30 października 2016, 13:01

Problem tkwił w sposobie wypełniania vector tablicą. Ale ponieważ potrzebowałem vector wypełniony wartościami, które nie zmieniają się w trakcie całej pracy programu, to wypełniłem go w pętli, a potem już poszło:

Plik *.H
KOD cpp:     UKRYJ  
#include <vector>
//---------------------------------------------------------------------------
private:
        std::vector< String > sTab;


Plik *.CPP
KOD cpp:     UKRYJ  
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 String aTab[] = {"png", "jpg", "jpg", "tif", "tiff", "bmp", "psd"};

 int i = 0;
 do
 {
  sTab.push_back( aTab[i++] );
 }while( i < ARRAYSIZE(aTab) - 1 );
}
//---------------------------------------------------------------------------
BOOL __fastcall TForm1::CheckExt(String FileName)
{
  String sExt = ExtractFileExt(FileName).SubString(2, 5);

  vector< String >::iterator it;
  it = find( sTab.begin(), sTab.end(), sExt.c_str());
  if( it  != sTab.end() ) return true;
 return false;
}

I to działa.

Problem z twoją pomocą polymorphism jest taki, że tobie się już nie chce. Niby pomagasz, starając się na coś naprowadzić, ale na tym twoja pomoc się kończy. Już drugi raz usłyszałem od ciebie, że to nie będzie działać bo kompilator jest za stary. Zupełnie jakby rozwiązanie problemu nie było już możliwe bez wydania kilku tysięcy na nowe środowisko.
Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez polymorphism » niedziela, 30 października 2016, 13:49

@Norbit, jak by mi się nie chciało, to nie udzielałbym się na forum. A to, że mi się (jeszcze) chce, nie oznacza, że nie powinienem wymagać od drugiej strony jakiegoś wysiłku. Zasugerowałem Ci użycie kontenera set, dostałeś link do strony opisującej tę klasę. Jestem pewny, że nawet nie zastanowiłeś się, dlaczego akurat ten kontener, a nie inny (próby z vectorem to udowadniają). Nie spytałeś nawet. Jak byś to zrobił, to wiedziałbyś, że użycie vectora tak jak to zrobiłeś, nie rozwiązuje problemu szybkości wyszukiwania, ponieważ elementy są nieposortowane, a wyszukiwanie ma złożoność liniową. set jest kontenerem posortowanym, więc złożoność wyszukiwania ma złożoność logarytmiczną, czyli znacznie szybszą.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez Norbit » niedziela, 30 października 2016, 14:19

Użyłem vector, bo z set nic mi nie wychodziło, a kombinowałem wiele godzin. Nie pomogłeś.
Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez polymorphism » niedziela, 30 października 2016, 14:23

A co Ci nie wychodziło poza oczywiście wcześniejszym błędem?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez Norbit » niedziela, 30 października 2016, 15:39

O to, że nie pomogłeś jednak w rozwiązaniu problemu.
Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez polymorphism » niedziela, 30 października 2016, 19:37

Chyba źle przeczytałeś moje pytanie ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez Norbit » niedziela, 30 października 2016, 22:44

No chociażby jak zrobić to z set w oparciu o starsze biblioteki, albo jak wypełnić vector tablicą.
Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

Re: Szybkie porównanie rozszerzenia pliku

Nowy postprzez polymorphism » niedziela, 30 października 2016, 23:27

Tak jak pisałem: stworzyć sobie obiekt set<wstring> i dodawać kolejne rozszerzenia metodą insert.


Co do vectora i tablicy (po staremu) to:
KOD cpp:     UKRYJ  
std::vector<std::wstring> v(tab, tab + tab_size);

lub
KOD cpp:     UKRYJ  
v.assign(tab, tab + tab_size);

lub
KOD cpp:     UKRYJ  
std::copy(tab, tab + tab_size, std::back_inserter(v));

std::copy możesz użyć także do kontenera set:
KOD cpp:     UKRYJ  
std::copy(tab, tab + tab_size, std::inserter(s, s.begin()));
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości

cron