Wyszukiwanie wzorca w kodzie html

0

Cześć,

napisałem prosty program, który liczy występowanie słów pomiędzy jakimiś kluczowymi słowami np.
[kluczowe słowo start] liczenie wystepowanie [kluczowe słowo stop]
Jest on zrobiony na zasadzie wczytania do tablicy każdej linijki z pliku metodą getline. Problem pojawił się w wydajności. Przy 5k linijek wydajność oscyluje ~10-15s co niestety mnie nie zadowala. Jakim sposobem mógłbym zejść nawet poniżej sekundy ? Dodam, że tekst w pliku jest to zwykły kod html(źródło strony).
Oczywiście nie chcę jakiegoś gotowca tylko wskazówki.

0

A mozesz pokazac jak teraz to robisz? Bo trudno mi uwierzyć w tak słabą wydajność ;] Pokaż samą funkcję która szuka stringa wewnątrz drugiego stringa.

0

Zlicza mi ilość wystąpień frazy, a następnie zwraca wartość.

int Szukaj( string & tekst, string szukanaFraza )
{
    size_t znalezionaPozycja = tekst.find( szukanaFraza );
    long int i = 0;

    do
    {
        znalezionaPozycja = tekst.find(szukanaFraza, znalezionaPozycja + szukanaFraza.size() );
        size_t znalezionaPozycja2 = tekst.find( szukanaFraza );
        if ( znalezionaPozycja2 != string::npos)
            i++;
    } while( znalezionaPozycja != string::npos );
    return i;
}

Oczywiście powyższa funkcja jest jeszcze poprzedzoną funkcją, która przypisuje odpowiednią kolejno linijkę z pliku do tablicy i zwraca string.

string Odczyt(int a)
{
    string wiersz;
    ifstream plik;
    plik.open ( "plik.txt" );

    string tablica[ilosc_wierszy()];
    int i = 0;
        while ( !plik.eof() || i <= a )
        {
            getline( plik, wiersz);
            tablica[i] = wiersz;
            i++;
        }
    plik.close();
    return tablica[a-1];
}

Mam przeczucie, że pierwszy kod działa najwolniej bo mam funkcję, która sprawdza mi ilość linijek w pliku i wykonuje swoje zadanie poniżej sekundy.
Dałoby się jakoś pominąć tablicę ? Bo chyba cały problem polega na sprawdzeniu x tablic co może być powolnym procesem...
(Oczywiście zastosowałem trick bo wiem, że w moim pliku szukana wartość jest pod koniec dlatego zaczynam od końca, gdybym miał wyszukiwać frazy od początku skrypt wykonywałby mi się 60sek.)

PS: Dopiero uczę się programować...

0
  1. A czemu nie wczytasz całego pliku od razu? Bo trochę nie ogarniam jaką to niby zrobi ci różnicę, oprócz tego ze będzie szybciej...
  2. Poza tym nie ogarniam zupełnie czemu za kazdym razem odpalasz dwa razy find, w tym jeden raz zawsze od początku stringa.
1

Jak można tak sobie życie utrudniać ?!

ifstream file("plik.txt");
string content;
getline(file,content,0);
size_t p=content.find("slowo kluczowe start");
size_t e=content.find("slowo kluczowe stop");
size_t count=0;
while((p=content.find("szukana fraza",p+1))<e) ++count;
cout<<"znaleziono "<<count<<" razy"<<endl;
0
  1. Problem w tym, że nie znam funkcji, która zrobi to elegancko, jedynie przychodzi mi do głowy metoda getline + dodawanie kolejnych stringow do jednego stringa. (Jak można to poproszę o wskazówkę)
  • Jaki jest domyślny limit znaków w string ?
  • Można jakoś elastycznie zwiększać wielkość (W locie)?

-Pierwszy find usunięty, spełniał wcześniej po prostu troszeczkę inną funkcję (kontrolną) i zapomniałem później skasować.
-W pętli użyłem 2x find bo w ten sposób najprościej przyszło mi do głowy jak uwarunkować zliczanie wystąpienia + zakończenie aplikacji. Pewnie da się to lepiej wykonać, ale nie wpadłem na lepszy pomysł(zaniechałem to bo działa to co aktualnie jest).

EDIT:
Rozumiem, że w przypadku powyżej metoda getline ściąga cały tekst z pliku przez dodanie wartości 0 ? (Tak jakby unlimited ?)

0

http://www.cplusplus.com/reference/string/string/getline/ tak trudno doczytać? Ostatni parametr to delimiter którego getline szuka w pliku. Jak mu dasz coś czego w pliku nie będzie (np. \0 którego w tekstowym pliku nie ma) to wczyta wszystko.

0

Co jeżeli w pliku tekstowym występują wszystkie znaki z zakresu ASCII ?

0

To jest to plik binarny a nie tekstowy, ale nadal można go łyknąć w całości jakimś fread:
http://www.cplusplus.com/reference/cstdio/fread/

0

Chyba zrobie sobie pętle, która bedzie dodawac do stringa dopóki !file.eof(), ale to już jutro: )

0
Cezikos napisał(a):

Co jeżeli w pliku tekstowym występują wszystkie znaki z zakresu ASCII ?
Gdyby babcia miała wąsy to byłaby dziadkiem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.