Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <windows.h>
- #include <fstream>
- #include <vector>
- using namespace std;
- /* run this program using the console pauser or add your own getch, system("pause") or input loop */
- int poczatek = -1;
- int koniec = -1;
- int szukaj(string wz, string te)
- {
- //szuka wz w te
- //znak zapytania "?" zastepuje dowolny znak
- //zwracamy -1 gdy nie znajdzie
- //w przeciwnym razie pozycje wz z miennej te
- int wynik = -1;
- int dlugoscWz = wz.length();
- int dlugoscTe = te.length();
- //analizujemy tylko gdy dlugosc tekstu (te) jest wieksza lub rowna wzorcowi (wz)
- if (dlugoscWz<= dlugoscTe)
- {
- //analizujemy pierwszy element wzorca i ka?dy z kolejnych elementow tekstu
- for (int i = 0; (i < dlugoscTe-dlugoscWz+1) && (wynik==-1); i++)
- {
- if ((te[i]==wz[0]) || (wz[0]=='?'))
- {
- //sprawdzamy ka?dy element wzorca
- int j = 1;
- wynik = i;
- int k =i+1;
- while ((j<dlugoscWz) && (wynik != -1))
- {
- if ((te[k]!=wz[j]) && (wz[j]!='?'))
- {
- wynik = -1;
- }
- j++;
- k++;
- };
- }
- }
- }
- return wynik;
- }
- string usunGwiazdki(string s)
- {
- while ((s[0]=='*') && (s.length()>0 ))
- {
- s = s.substr(1,s.length()-1);
- }
- while ((s[s.length()-1]=='*') && (s.length()>0))
- {
- s = s.substr(0,s.length()-1);
- }
- return s;
- }
- int dlugoscBezGwiazdek(string s)
- {
- int dlugosc = 0;
- for (int i = 0; i < s.length(); i++)
- {
- if (s[i]!='*')
- {
- dlugosc ++;
- }
- }
- return dlugosc;
- }
- vector<string> podzielWzorzec(string wzorzec)
- {
- vector<string> wektor;
- while (wzorzec.length()>0)
- {
- int pos = wzorzec.find('*');
- if (pos == -1 )
- {
- wektor.push_back( wzorzec );
- wzorzec = "";
- }
- else
- {
- wektor.push_back( wzorzec.substr(0, pos) );
- wzorzec = wzorzec.substr(pos+1,wzorzec.length()-pos);
- wzorzec = usunGwiazdki(wzorzec);
- }
- }
- return wektor;
- }
- //szuka pierwszy element wektora w stringu testk
- int szukajRek(vector<string> wektor, string tekst)
- {
- //cout<<wektor[0]<<endl;
- //cout<<tekst<<endl;
- if (wektor.size()==1)
- {
- int wynik = szukaj(wektor[0], tekst);
- if ((poczatek==-1) && (wynik !=-1))
- {
- poczatek = wynik;
- }
- if ((poczatek!=-1) && (wynik !=-1))
- {
- koniec = tekst.length()- wynik - wektor[0].length();
- }
- return wynik;
- }
- else
- {
- int wynik = szukaj(wektor[0],tekst);
- if (wynik == -1)
- {
- return -1;
- }
- else
- {
- if (poczatek == -1)
- {
- poczatek = wynik;
- }
- string pier = wektor[0];
- wektor.erase(wektor.begin());
- int wynikTmp = szukajRek(wektor, tekst.substr(wynik + pier.length(),tekst.length()-wynik-pier.length()));
- if (wynikTmp ==-1)
- {
- return -1;
- }
- else
- {
- return wynik;
- }
- }
- }
- }
- int szukajMain(string wzorzec, string tekst)
- {
- //najpierw usuwamy z wzorca gwiazdki na pocz1tku i na koncu (jako nieznacz1ce)
- wzorzec = usunGwiazdki(wzorzec);
- //sprawdzamy dlugosc bez gwiazdek
- //wzorzec bez gwiazdek nie moze byc dluzszy od tekstu
- int wynik = -1;
- if (dlugoscBezGwiazdek(wzorzec)<= tekst.length())
- {
- //dzielimy wzorzec na podwzorce, jako "dzielnika" uzywajac gwiazdki
- //np: tele*zor dzielimy na dwa stringi: tele, zor
- //algorytm szukania wzorca "tele*zor" polega najpier na znalezieniu wzorca "tele" i tylko w przypadku sukcesu
- //szukanie wzorca "zor" ale nie w ca3ym stringu wejociowym, tylko "na prawo" znalezionego "tele"
- //
- //np.
- //dany jest tekst: "0123456789telewizor++++++"
- //najpierw szukamy "tele" - znajdujemy go na pozycji nr 10
- //wtedy szukamy "zor" pocz1wszy od pozycji nr 14 (10 + dlugosc(tele))
- //itd
- vector<string> wektor = podzielWzorzec(wzorzec);
- wynik = szukajRek(wektor,tekst);
- //wynik = szukaj(wzorzec, tekst);
- }
- return wynik;
- }
- bool wyswietlZawartoscPliku( string sNazwaPliku )
- {
- ifstream plik;
- plik.open( sNazwaPliku.c_str() );
- if( !plik.good() )
- return false;
- string wiersz;
- while( getline( plik, wiersz ) )
- cout << wiersz << endl;
- plik.close();
- return true;
- }
- bool szukajWPliku( string wzorzec, string sNazwaPliku )
- {
- int numerWiersza = 0;
- ifstream plik;
- plik.open( sNazwaPliku.c_str() );
- if( !plik.good() )
- return false;
- string wiersz;
- while( getline( plik, wiersz ) )
- {
- numerWiersza++;
- int wynik = szukajMain(wzorzec, wiersz);
- if (wynik !=-1)
- {
- string znalezionyTekst = wiersz.substr(poczatek, wiersz.length()-koniec-poczatek);
- cout<<"Plik: "<<sNazwaPliku<<" wiersz: "<<numerWiersza<<" tekst: "<<znalezionyTekst<<endl;
- }
- }
- plik.close();
- return true;
- }
- int main(int argc, char** argv) {
- string wzorzec="";
- //jesli brak argumentów - pytamy o wzorzec
- if (argc==1)
- {
- cout<<"Podaj wzorzec: ";
- cin>>wzorzec;
- //wzorzec="p*s";
- }
- else
- {
- wzorzec = argv[1];
- }
- HANDLE hFind;
- WIN32_FIND_DATA FindData;
- hFind = FindFirstFile("*.txt", &FindData);
- //cout << FindData.cFileName << endl;
- szukajWPliku( wzorzec, FindData.cFileName );
- //wyswietlZawartoscPliku(FindData.cFileName);
- while (FindNextFile(hFind, &FindData))
- {
- //cout << FindData.cFileName << endl;
- szukajWPliku( wzorzec, FindData.cFileName );
- }
- // Close the file handle
- FindClose(hFind);
- //cout<<"koniec"<<endl;
- //getchar();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement