wyszukiwanie w plikach

0

Witam mam problem z wyszukiwaniem tekstu w plikach prosze o pomoc i nakierowanie na błąd.

//baza danych na klasach 
// z uzyciem wektorów i stringów 
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <windows.h>
using namespace std;

class pliki									// deklaracja klasy ' pliki ' 
{
   private:					//private - wszystkie elementy klasy bazowej zmieniają się w prywatne.
   int i;									//deklaracja zmiennej i 
   char nazwa_pliku[10][40];		 // nazwa pliku w tablicy 
   
   public: 			//public - np. zmienne lub funkcje mają taką widoczność jak w klasie bazowej.
   short int wyszukiwanie();			//deklaracja wyszukiwania i wczytywania z listy 
   void wczytywanie();					//wczytywanie i lista typu void sa publiczne
   void lista();
   
   pliki()
   {
      i=0;												//inkremantacja ' i '
   }
};

class interfejs												// deklaracja klasy interfejs
{
   private:
   char wybor;													//deklaracja zmiennych wybor , wybierz opcje 
   void wybierz_opcje();
   
   public:														//wyswietl menu 
   void wyswietl_menu();									//wyswietlanie menu typu void jest publiczne
   pliki dokumenty;													
   
};

void interfejs::wyswietl_menu()						//interfejs przypisany do wyswietl menu
{
   do	//menu 
   {
   cout << "\n\n\t\t\t\t  >>>MENU<<< \n\t\t\t\t";
   cout << endl;
   cout << " 1.Szukaj slowa \n" ;
   cout << " 2.Wczytaj plik \n" ;
   cout << " 3.Wczytaj liste plikow \n";
   cout << " 0.Wyjscie \n\n" ;      
   cout << "Co chcesz zrobic: " ;
   cin >> wybor;
   Sleep(1000);									//opóźnienie wypisywanego tekstu
   wybierz_opcje();								//pokazuje wybraną opcję
   }
   while (wybor!='0');						//wybór
}

void interfejs::wybierz_opcje()			//wybieranie opcji inferfejsu == menu 
{   
   switch(wybor)					//switch menu
    {
      case '1':											//case '1' wyszukuje słów
      cout << endl;
      Sleep(1000);										//opóźnienie
	  dokumenty.wyszukiwanie();						
	  
	  break;
      
      case '2':										//case '2' wczytuje pliki
      cout << endl;
      cout << "\t\t\tDokument wczytywania...\n";
      Sleep(1000);											//opóźnienie
	  dokumenty.wczytywanie();
	  break;
      
      case '3':										//case '3' pokazuje wczytane pliki 
      cout << endl;
      cout << "\t\t\tLista dokumentow...\n";
      Sleep(1000);										//opóźnienie
	  dokumenty.lista();
      break;
      
      case '0':										//case '0' konczy prace programu
      cout << endl;
      cout << "\t\t\tWybrales numer 0...!\n";			
      Sleep(1000);									//opóźnienie
      cout << "\t\t\tKoncze program...!\n";
      break;
      
      default:											//default informuje o złym wybranym klawiszu przez użytkownika
      cout << endl;
      cout << "\t\t\tWybierz poprawny numer...!\n";
      Sleep(1000);													//opóźnienie
      break;
   }
}

short int pliki::wyszukiwanie()			//pliki przypisane do wyszukiwanie
{
   if (i<1)											//jesli i < 1 
   {
      cout << "\t\t\tNie wczytano zadnych plikow!\n";			// oznacza to , że zadne pliki nie zostały wczytane
      return 0;	
   }  														
   
   ifstream znajdz;											//deklaracja znadz typu ifstream
   string szukane_slowo;									//deklaracja zmiennej typu string szukane_slowo
   cout << "\t\t\tPodaj szukane slowo: ";	
   cin >> szukane_slowo;
   
   for (int j=1; j<=i; j++)										// i musi = 1 ; j mniejsze lub równe i ; j inkrementowane
   {   
      znajdz.open(nazwa_pliku[j-1]);							
       size_t licznik = 0;									//size_t przypisuje licznikowi długosc 0 
       
       while(!znajdz.eof() )								//szukanie po lini z nazwy pliku , warunek do póki plik skonczony 
       {														//znajdz zostało wczesniej == do nazwa_pliku 
          string linia;
          getline(znajdz, linia);			
          vector<string> slowa;
         
          for(size_t n = 0; n < slowa.size(); n++)

            if (slowa[n] == szukane_slowo)
            licznik++;
       }

       znajdz.close();
       cout<<"Ilosc slow "<<szukane_slowo<<"' w pliku " << nazwa_pliku[j-1] <<": "<<licznik<<endl;
   }
   
   return 0;
}

void pliki::wczytywanie()							//funkcja void która wczyta nazwe pliku 
{
   cout << "\t\t\tPodaj nazwe pliku do wczytania: ";		
   cin >> nazwa_pliku[i];								//wprowadzenie nazwy pliku 
   
   fstream plik;										//deklaracja pliku 
   plik.open(nazwa_pliku[i]);								//otwieranie pliku 
   if (plik.good()==true)							//jesli plik jest dobry , wypisz -- 
   {
      cout << "\t\t\tUzyskano dostep do pliku " << nazwa_pliku[i] << endl;		// --
      i++;
   }
   else																//jesli pliku nie mozna znaleźć , wypisz --  
   cout << "\tNie moge odtworzyc pliku. Plik nie istnieje lub jest uszkodzony.\n";		//--
   }
   
void pliki::lista()						//zmienna pliki typu void przypisana do lista 
{
   if (i<1)													//jesli i < 1 
   {
      cout << "\t\t\tNie wczytano zadnych plikow!\n";						// wyswietli komunikat 
   }
   else													//jesli i > 1 
   {
      cout << "\t\t\tW bazie znajduja sie: ";								//wyswietli komunikat 
      for (int j=0; j<i; j++)						// j=0 ; j < 1 ; inkrementacja j ++ , j zwiekszane z kazdym kolejnym plikiem
	  cout << nazwa_pliku[j] << ",   ";									// wypisane zostaną nazwy plików [j]
      cout << endl;
   }   
}   


int main()
{
   interfejs menu;				
   menu.wyswietl_menu();
   
   return 0;
} 

0

Jeden z prostszych sposobów (ale nie optymalny) - wczytać cały plik do std::string i potem wykorzystać metodę find.

0

Jeśli by ktoś mógł mi napisać lub po prostu powiedzieć jak użyć tu funkcji find .
Wstawiam kawałek kodu .

ifstream znajdz;											
   string szukane_slowo;									
   cout << "Podaj szukane slowo ktore chcesz znalezc: ";
   cin >> szukane_slowo;
   
   for (int j=1; j<=i; j++)								
   {   
      znajdz.open(nazwa_pliku[j-1]);										
       int licznik = 0;									
       
       while(!znajdz.eof() )								
       {														
          string slowa;											
          getline(znajdz, slowa);										
		  
		  																		
          licznik++;												
       }																	
        znajdz.close();												
        cout<<"Ilosc slow "<<szukane_slowo<<" w pliku " << nazwa_pliku[j-1] <<": "<<licznik<<endl;
   		// wypisuje na ekran konsoli szuane slowo i nazwe pliku i ilosc znalezionych znakow
1

slowa.find(szukane_slowo) != string::npos => znaleziono słowo, w przeciwnym przypadku – nie.

Edit Ale to i tak przekombinowane, jeśli masz zliczać słowa wystarczy to:

while (plik >> slowo)
    if (slowo == szukane_slowo)
        ++licznik;
0
znajdz.open(nazwa_pliku[j-1]);	//otwieram zmienna znajdz ktora szuka nazwy_pliku i j zmniejsza o 1 							
       int licznik = 0;									
       
       while(!znajdz.eof())		//szukanie po lini z nazwy pliku , warunek do póki plik skonczony 
       {													//znajdz zostało wczesniej == do nazwa_pliku 
	   	  licznik++;		//inkrementacja licznika ktory policzy ile razy ta petla została wykonana				
          string slowa;											
          getline(znajdz, slowa);		 // co tu brakuje ??
		  slowa.find(szukane_slowo) != string::npos	;																	
          													
       }

Proszę o pomoc

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