Wyszukiwanie typu wildcard

0

Cześć ,
Mam wyszukać w bazie użytkowników np imie Janek , ma byc tak ze gdy wpisze JA% pokażą sie wszyscy użytkownicy którym imiona zaczynają się od JA , jak napisać taka funkcje ?

1

Naiwnie: Jeżeli ma być tylko % na końcu lub początku możesz sprawdzić gdzie w szukanym wzorcu jest % następnie usunąć go z patternu i za pomocą funkcji string::starts_with oraz string::ends_with sprawdzić czy tak sie zaczyna lub kończy.

Mniej naiwnie: iterując po napotkaniu '%' sprawdzamy czy następny znak w patternie pasuje do obecnego znaku w danych wejściowych, jeżeli nie to przeskakujemy do kolejnego znaku w danych wejściowych. Jak dojdziemy do końca to znaczy ze wzorzec pasuje.

Ps. pod hasłem "wildcard pattern search" jest dużo ciekawej teorii,

3

Inna opcja: zamień % na .* i użyj wyrażeń regularnych.

1

To jest proste do napisania. Dzielisz wzorzec na segmenty rozdzielone %, a potem dopasowujesz segmenty do wyrazu, który ma pasować do wzorca.
Wyrażenia regularne są drogą na skróty, ale jak się nie wie co się robi to wprowadzi się dziwne bugi (proste zastąpienie % przez .* skończy się wieloma problemami).

0

Nazywa się to "globbing", masz w POSIX API w C https://linux.die.net/man/3/glob, ewentualnie faktycznie zamieniaj na regexy.

0
Spearhead napisał(a):

Nazywa się to "globbing", masz w POSIX API w C https://linux.die.net/man/3/glob, ewentualnie faktycznie zamieniaj na regexy.

dziekuje

0

niestety nie daje rady sobie z tym poradzić , w mojej apace wybor 7 to wyszukiwanie , mam plik o nazwie lekarstwa.txt , plik w jednej lini ma zapisane apap teva 10 w drugiej nurofen texim 10 i tak dalej ,
apap to nazwa leku teva to producent a 10 to liczba sztuk , chce aby po wpisaniu np nazwy leku apap wyskoczyła mi lista samych apapow a po wpisaniu nurofen samych nurofenow

zrobiłem tak ale nie działa :

if (wybor1==7)
{
string tekst ;

            	ifstream plik;
                plik.open( "leskarstwa.txt", ios::in );

                 cout << "Podaj Tytul do wyszukania" << endl;
                 cin >> tekst;
                 getline(plik,tekst)
            	if( tekst.find( tekst ) != std::string::npos )
             {
             	cout<<tekst; 
             	
             	
             }
0

w linijce w której szukasz, jako szukany tekst podajesz cała tą linijkę. Zmień tekst.find( tekst ) na tekst.find( wzorzec )

0
std::ifstream plik("leskarstwa.txt");

std::cout << "Podaj Tytul do wyszukania\n";
std::cin >> tytul;

while (std::getline(plik, tekst)) {
    if (tekst.find(tytul) != std::string::npos)
        std::cout << tekst << '\n';
}
0
0x666 napisał(a):
std::ifstream plik("leskarstwa.txt");

std::cout << "Podaj Tytul do wyszukania\n";
std::cin >> tytul;

while (std::getline(plik, tekst)) {
    if (tekst.find(tytul) != std::string::npos)
        std::cout << tekst << '\n';
}

niestety nic nie wyszukuje :(

0

Sprawdź, czy w ogóle plik się otwiera (metoda is_open).

0
0x666 napisał(a):

Sprawdź, czy w ogóle plik się otwiera (metoda is_open).

ok byla wpisana bledna nazwa pliku , otwiera i wyszukuje ale wszystko , np po wpisaniu apap - wyswietla cala baze a ma tylko wyswietlac leki o nazwie apap

0

To jeszcze sprawdź, czy dobrze przeniosłeś kod, który podałem.

0

tak zrobilem :

if (wybor1==7)
{
string tekst ;

            	ifstream plik;
                plik.open( "lekarstwa.txt", ios::in );

                 std::cout << "Podaj tekst do wyszukania\n";
             std::cin >> tekst;


                while (std::getline(plik, tekst)) {
                 if (tekst.find(tekst) != std::string::npos)
                 std::cout << tekst << '\n';

}

0

To nie jest to samo, co Ci podałem. Co dajesz w argumencie metodzie find?

0
0x666 napisał(a):

To nie jest to samo, co Ci podałem. Co dajesz w argumencie metodzie find?

tekst ktory wpisze w cin ( tekst )

czy mam utworzyc nowego stringa line ? i wtedy bedzie szukal w 1 lini ?

0

OK dziala , dziekuje - wyglada to tak :

{
string tytul;
string tekst;

           	std::ifstream plik("lekarstwa.txt");

          std::cout << "Podaj Tytul do wyszukania\n";
          std::cin >> tytul;

          while (std::getline(plik, tekst)) {
           if (tekst.find(tytul) != std::string::npos)
            std::cout << tekst << '\n';

}

0
0x666 napisał(a):

Zdefiniuj stringa tytul i wklej dokładnie to, co podałem

tak zrobilem , dziekuje za pomoc !!

0
karol870 napisał(a):
0x666 napisał(a):

Zdefiniuj stringa tytul i wklej dokładnie to, co podałem

tak zrobilem , dziekuje za pomoc !!

A jak dopisac aby gdy nie znajdzie danego leku w pilku wyświetliło komunikat BRAK LEKU W BAZIE ?
Chcialem uzyc :
```
else
{
cout<<"brak podanego leku w bazie";
}

			break;	
                            ```

ale gdy tak dodam program sie nie komplikuje

0
bool ok = false;

while (std::getline(plik, tekst)) {
    if (tekst.find(tytul) != std::string::npos) {
        std::cout << tekst << '\n';
        ok = true;
    }
}

if (!ok)
    std::cout << "Brak podanego leku w bazie\n";

1 użytkowników online, w tym zalogowanych: 0, gości: 1