Wyszukiwanie frazy w pliku tekstowym i wyświetlanie 6 kolejnych lini pliku po znalezionej frazie
Ostatnio zmodyfikowano 2014-01-14 07:35
hooligans1293 Temat założony przez niniejszego użytkownika |
Wyszukiwanie frazy w pliku tekstowym i wyświetlanie 6 kolejnych lini pliku po znalezionej frazie » 2014-01-09 20:50:54 Witam wszystkich, robię prostą bazę danych i napotkałem problem z wyszukiwaniem frazy, napisałem funkcje odpowiadającą za wyszukiwanie lecz za każdym razem pokazuje mi, ze fraza nie została znaleziona choć znajduje się w pliku. Gdy fraza zostanie znaleziona w tekście to na ekranie powinno pokazać się 7 linijek pliku tekstowego a konkretnie chodzi mi o coś takiego : załóżmy, że w pliku znajdują się takie dane: Titanic //tytul 234 //czas trwania 1999 // rok tit-1999-234 //nr. katalogowy 1920 //szerokość klatki 1080 //wysokość klatki ring 123 1999 rin-1999-123 1920 1080 Gdy użytkownik zechce wyszukać frazy Titanic to na ekranie powinno pojawić się coś takiego: Tytul: Titanic Czas: 234 Rok: 1999 Nr: tit-1999-234 Szer: 1920 Wys: 1080 A oto kod, który umęczyłem do tej pory #include <iostream> #include <conio.h> #include <math.h> #include <time.h> #include <cstdlib> #include <string.h> #include <stdio.h> #include <fstream>
using namespace std;
fstream plik_dane;
struct dvdinfo { char tytul[ 50 ]; float czastrwania; float rokwyd; char nrkatalog[ 20 ]; int szeklatki; int wsklatki; };
void szukajWszystkichFraz( string & tekst, string szukanaFraza ) { size_t znalezionaPozycja = tekst.find( szukanaFraza ); if( znalezionaPozycja == string::npos ) { cout << "Nie znaleziono frazy w tekscie" << endl; return; } do { cout << "Fraza zostala odnaleziona na pozycji " << znalezionaPozycja << endl; znalezionaPozycja = tekst.find( szukanaFraza, znalezionaPozycja + szukanaFraza.size() ); } while( znalezionaPozycja != string::npos ); } int main( int argc, char ** argv ) { cout << "\t**********************************************" << endl; cout << "\t*************** Baza plyt DVD ****************" << endl; cout << "\t**********************************************" << endl << endl; start: cout << "--------------------------------------------------------------" << endl << endl;; cout << "===> (1) Dodaj nowa plyte do bazy" << endl; cout << "===> (2) Usun plyte z bazy" << endl; cout << "===> (3) Sortowanie bazy" << endl; cout << "===> (4) Wyszukiwanie plyty w bazie" << endl; cout << "===> (5) Zamknij program" << endl << endl; int wybor; int n, koniec; koniec = 1; string szukaj, podane; cout << endl; do { cout << "Wprowadz symbol operacji ktora chcesz wykonac " << endl << endl; cout << "===> "; cin >> wybor; cout << "--------------------------------------------------------------" << endl << endl; if( wybor > 5 ) { cout << "\t------------------------------------" << endl; cout << "\t-- Symbol operacji niepoprawny --" << endl; cout << "\t------------------------------------" << endl << endl; cout << "\t------------------------------------" << endl; cout << "\t--Wprowadz ponownie symbol operacji--" << endl; cout << "\t------------------------------------" << endl << endl; } else switch( wybor ) { case 1: cout << "Wybrales dodawanie plyt" << endl << endl << endl; cout << "--------------------------------------------------------------" << endl << endl; dvdinfo newdvd; cout << "Podaj tytul plyty " << endl; cout << "===>"; cin >> newdvd.tytul; cout << endl; cout << "Podaj czas trwania filmu w minutach " << endl; cout << "===>"; cin >> newdvd.czastrwania; cout << endl; cout << "Podaj rok wydania plyty " << endl; cout << "===>"; cin >> newdvd.rokwyd; cout << endl; cout << "Podaj numer katalogowy plyty **" << endl << endl; cout << "**(numer katalogowy to pierwsze 3 znaki tytulu, rok wydania i czas trwania" << endl; cout << " w postaci xxx-xxxx-xxx np. tit-1999-234)" << endl; cout << "===>"; cin >> newdvd.nrkatalog; cout << endl; cout << "Podaj szerokosc klatki " << endl; cout << "===>"; cin >> newdvd.szeklatki; cout << endl; cout << "Podaj wysokosc klatki " << endl; cout << "===>"; cin >> newdvd.wsklatki; system( "cls" ); cout << "-------------------------------------------------------------------------------" << endl; cout << "\t <<<< Dodales plyte >>>>" << endl; cout << "\t| Tytul :: " << newdvd.tytul << endl; cout << "\t| Czas trwania :: " << newdvd.czastrwania << " min" << endl; cout << "\t| Rok wydania :: " << newdvd.rokwyd << endl; cout << "\t| Numer katalogowy :: " << newdvd.nrkatalog << endl; cout << "\t| Rozmiar klatki :: " << newdvd.szeklatki << " x " << newdvd.wsklatki << endl; plik_dane.open( "dvd_data.txt", ios::app | ios::ate ); if( plik_dane.good() == true ) { ofstream plik_dane; plik_dane.open( "dvd_data.txt", ios::app | ios::ate | ios::out ); plik_dane << newdvd.tytul << "\r\n"; plik_dane << newdvd.czastrwania << "\r\n"; plik_dane << newdvd.rokwyd << "\r\n"; plik_dane << newdvd.nrkatalog << "\r\n"; plik_dane << newdvd.szeklatki << "\r\n"; plik_dane << newdvd.wsklatki << "\r\n"; plik_dane << "\r\n"; plik_dane.close(); } else cout << "Blad odczytu pliku!" << endl; goto start; break; case 2: cout << "Wybrales usuwanie plyt" << endl; cout << "--------------------------------------------------------------" << endl << endl; break; case 3: cout << "Wybrales sortowanie plyt" << endl; cout << "--------------------------------------------------------------" << endl << endl; break; case 4: cout << "Wybrales wyszukiwanie plyt" << endl; cout << "--------------------------------------------------------------" << endl << endl; cout << "Podaj Tytul filmu jaki chcesz znalezc" << endl; cin >> podane; szukajWszystkichFraz( szukaj, podane ); break; case 5: system( "cls" ); cout << endl; cout << "\t----------------------------------------------------------" << endl; cout << "\t----- Aby zakonczyc dzialanie programu nacisnij ENTER----- " << endl; cout << "\t----------------------------------------------------------" << endl << endl; koniec = 0; break; } } while( koniec = 0 ); return 0; }
|
|
leon_w |
» 2014-01-09 20:59:46 Coś nie widzę, gdzie nadajesz wartość stringowi "szukaj", a to w nim wyszukujesz. |
|
hooligans1293 Temat założony przez niniejszego użytkownika |
» 2014-01-09 21:12:02 przerobiłem program zmieniając cin >> podane na cin >> szukaj i teraz program się zapętla i pokazuję cały czas, że fraza znajduje się na miejscu zerowym |
|
leon_w |
» 2014-01-09 21:21:19 Przemyśl dokładnie działanie funkcji void szukajWszystkichFraz( string & tekst, string szukanaFraza )
|
W czym tak naprawdę ta funkcja ma szukać?? Wg mnie, musisz otworzyć plik, pętlą sprawdzać, gdzie znajduje się szukany tekst, po znalezieniu wyświetlić te 7 linijek. @edit Nie wiem, po co za każdym razem przy zapisie do pliku, wracasz karetką do początku lini. Przez to wszystko się zapisuje i tak w jednej lini. |
|
colorgreen19 |
» 2014-01-09 21:28:20 Mozesz tez zrobic, zeby petla sprawdzala czy char tablica[ x ] jest rowne zmiennej do ktorej uzytkownik wpisal szukany tekst i przerwac dzialanie peetli a nastepnie wyswietlic tekst ze struktury o tym samym "x" for( int i = 0; i <( liczba danych ze struktury ); i++ ) { if(( zmienna wpisana przez usera ) ==( ze struktury tytul ) ) { break; } }
|
|
hooligans1293 Temat założony przez niniejszego użytkownika |
» 2014-01-09 21:56:26 rozwiązanie nie może opierać się na tablicach pomocniczych. Zmodyfikowałem kod, dodałem otwieranie plik lecz teraz wywala mi błąd składni wywołanej funkcji w switchu, (te funkcje to dla mnie czarna magia nie mogę tego obczaić co w tych nawiasach wstawiać) oto zmodyfikowany kod: #include <iostream> #include <conio.h> #include <math.h> #include <time.h> #include <cstdlib> #include <string.h> #include <stdio.h> #include <fstream>
using namespace std;
fstream plik_dane;
struct dvdinfo { char tytul[ 50 ]; float czastrwania; float rokwyd; char nrkatalog[ 20 ]; int szeklatki; int wsklatki; };
void szukajWszystkichFraz( string & plik_dane, string szukanaFraza ) { size_t znalezionaPozycja = plik_dane.find( szukanaFraza ); if( znalezionaPozycja == string::npos ) { cout << "Nie znaleziono frazy w tekscie" << endl; return; } do { cout << "Fraza zostala odnaleziona na pozycji " << znalezionaPozycja << endl; znalezionaPozycja = plik_dane.find( szukanaFraza, znalezionaPozycja + szukanaFraza.size() ); } while( znalezionaPozycja != string::npos ); } int main( int argc, char ** argv ) { cout << "\t**********************************************" << endl; cout << "\t*************** Baza plyt DVD ****************" << endl; cout << "\t**********************************************" << endl << endl; start: cout << "--------------------------------------------------------------" << endl << endl;; cout << "===> (1) Dodaj nowa plyte do bazy" << endl; cout << "===> (2) Usun plyte z bazy" << endl; cout << "===> (3) Sortowanie bazy" << endl; cout << "===> (4) Wyszukiwanie plyty w bazie" << endl; cout << "===> (5) Zamknij program" << endl << endl; int wybor; int n, koniec; koniec = 1; string szukane; cout << endl; do { cout << "Wprowadz symbol operacji ktora chcesz wykonac " << endl << endl; cout << "===> "; cin >> wybor; cout << "--------------------------------------------------------------" << endl << endl; if( wybor > 5 ) { cout << "\t------------------------------------" << endl; cout << "\t-- Symbol operacji niepoprawny --" << endl; cout << "\t------------------------------------" << endl << endl; cout << "\t------------------------------------" << endl; cout << "\t--Wprowadz ponownie symbol operacji--" << endl; cout << "\t------------------------------------" << endl << endl; } else switch( wybor ) { case 1: cout << "Wybrales dodawanie plyt" << endl << endl << endl; cout << "--------------------------------------------------------------" << endl << endl; dvdinfo newdvd; cout << "Podaj tytul plyty " << endl; cout << "===>"; cin >> newdvd.tytul; cout << endl; cout << "Podaj czas trwania filmu w minutach " << endl; cout << "===>"; cin >> newdvd.czastrwania; cout << endl; cout << "Podaj rok wydania plyty " << endl; cout << "===>"; cin >> newdvd.rokwyd; cout << endl; cout << "Podaj numer katalogowy plyty **" << endl << endl; cout << "**(numer katalogowy to pierwsze 3 znaki tytulu, rok wydania i czas trwania" << endl; cout << " w postaci xxx-xxxx-xxx np. tit-1999-234)" << endl; cout << "===>"; cin >> newdvd.nrkatalog; cout << endl; cout << "Podaj szerokosc klatki " << endl; cout << "===>"; cin >> newdvd.szeklatki; cout << endl; cout << "Podaj wysokosc klatki " << endl; cout << "===>"; cin >> newdvd.wsklatki; system( "cls" ); cout << "-------------------------------------------------------------------------------" << endl; cout << "\t <<<< Dodales plyte >>>>" << endl; cout << "\t| Tytul :: " << newdvd.tytul << endl; cout << "\t| Czas trwania :: " << newdvd.czastrwania << " min" << endl; cout << "\t| Rok wydania :: " << newdvd.rokwyd << endl; cout << "\t| Numer katalogowy :: " << newdvd.nrkatalog << endl; cout << "\t| Rozmiar klatki :: " << newdvd.szeklatki << " x " << newdvd.wsklatki << endl; plik_dane.open( "dvd_data.txt", ios::app | ios::ate ); if( plik_dane.good() == true ) { ofstream plik_dane; plik_dane.open( "dvd_data.txt", ios::app | ios::ate | ios::out ); plik_dane << newdvd.tytul << "\r\n"; plik_dane << newdvd.czastrwania << "\r\n"; plik_dane << newdvd.rokwyd << "\r\n"; plik_dane << newdvd.nrkatalog << "\r\n"; plik_dane << newdvd.szeklatki << "\r\n"; plik_dane << newdvd.wsklatki << "\r\n"; plik_dane << "\r\n"; plik_dane.close(); } else cout << "Blad odczytu pliku!" << endl; goto start; break; case 2: cout << "Wybrales usuwanie plyt" << endl; cout << "--------------------------------------------------------------" << endl << endl; break; case 3: cout << "Wybrales sortowanie plyt" << endl; cout << "--------------------------------------------------------------" << endl << endl; break; case 4: cout << "Wybrales wyszukiwanie plyt" << endl; cout << "--------------------------------------------------------------" << endl << endl; plik_dane.open( "dvd_data.txt", ios::app | ios::ate | ios::in ); if( plik_dane.good() == true ) { ofstream plik_dane; plik_dane.open( "dvd_data.txt", ios::app | ios::ate | ios::out ); cout << "Podaj Tytul filmu jaki chcesz znalezc" << endl; cin >> szukane; szukajWszystkichFraz( plik_dane, szukane ); plik_dane.close(); } else cout << "Blad odczytu pliku!" << endl; break; case 5: system( "cls" ); cout << endl; cout << "\t----------------------------------------------------------" << endl; cout << "\t----- Aby zakonczyc dzialanie programu nacisnij ENTER----- " << endl; cout << "\t----------------------------------------------------------" << endl << endl; koniec = 0; break; } } while( koniec = 0 ); return 0; }
Edit: Jakbyś mógł trochę jaśniej wyjaśnić to wracanie do pliku o, którym wspomniałeś. Chodzi Ci o pierwszego case ? |
|
leon_w |
» 2014-01-09 22:09:40 Na szybko poprawione, więc mogą być błędy void szukajWszystkichFraz( string szukanaFraza ) { ifstream plik_dane; plik_dane.open( "dvd_data.txt", ios::in ); string tekst; do { getline( plik_dane, tekst ); if( tekst.find( szukanaFraza ) ) { for( int i = 0; i < 7; i++ ) { cout << tekst << endl; getline( plik_dane, tekst ); } return; } } while( getline( plik_dane, tekst ) ); plik_dane.close(); }
|
|
hooligans1293 Temat założony przez niniejszego użytkownika |
» 2014-01-09 22:54:41 Nie mam pojęcia co może być nie tak, teraz nie mam opcji do wprowadzania, nie wiem czy argumenty nie tak czy coś innego #include <iostream> #include <conio.h> #include <math.h> #include <time.h> #include <cstdlib> #include <string.h> #include <stdio.h> #include <fstream>
using namespace std;
fstream plik_dane;
struct dvdinfo { char tytul[ 50 ]; float czastrwania; float rokwyd; char nrkatalog[ 20 ]; int szeklatki; int wsklatki; };
void szukajWszystkichFraz( string szukanaFraza ) { ifstream plik_dane; plik_dane.open( "dvd_data.txt", ios::in ); string tekst; cout << "Podaj Tytul do wyszukania" << endl; cin >> tekst; do { getline( plik_dane, tekst ); if( tekst.find( szukanaFraza ) ) { for( int i = 0; i < 7; i++ ) { cout << tekst << endl; getline( plik_dane, tekst ); } return; } } while( getline( plik_dane, tekst ) ); plik_dane.close(); } int main( int argc, char ** argv ) { cout << "\t**********************************************" << endl; cout << "\t*************** Baza plyt DVD ****************" << endl; cout << "\t**********************************************" << endl << endl; start: cout << "--------------------------------------------------------------" << endl << endl;; cout << "===> (1) Dodaj nowa plyte do bazy" << endl; cout << "===> (2) Usun plyte z bazy" << endl; cout << "===> (3) Sortowanie bazy" << endl; cout << "===> (4) Wyszukiwanie plyty w bazie" << endl; cout << "===> (5) Zamknij program" << endl << endl; int wybor; int n, koniec; koniec = 1; string szukane; cout << endl; do { cout << "Wprowadz symbol operacji ktora chcesz wykonac " << endl << endl; cout << "===> "; cin >> wybor; cout << "--------------------------------------------------------------" << endl << endl; if( wybor > 5 ) { cout << "\t------------------------------------" << endl; cout << "\t-- Symbol operacji niepoprawny --" << endl; cout << "\t------------------------------------" << endl << endl; cout << "\t------------------------------------" << endl; cout << "\t--Wprowadz ponownie symbol operacji--" << endl; cout << "\t------------------------------------" << endl << endl; } else switch( wybor ) { case 1: cout << "Wybrales dodawanie plyt" << endl << endl << endl; cout << "--------------------------------------------------------------" << endl << endl; dvdinfo newdvd; cout << "Podaj tytul plyty " << endl; cout << "===>"; cin >> newdvd.tytul; cout << endl; cout << "Podaj czas trwania filmu w minutach " << endl; cout << "===>"; cin >> newdvd.czastrwania; cout << endl; cout << "Podaj rok wydania plyty " << endl; cout << "===>"; cin >> newdvd.rokwyd; cout << endl; cout << "Podaj numer katalogowy plyty **" << endl << endl; cout << "**(numer katalogowy to pierwsze 3 znaki tytulu, rok wydania i czas trwania" << endl; cout << " w postaci xxx-xxxx-xxx np. tit-1999-234)" << endl; cout << "===>"; cin >> newdvd.nrkatalog; cout << endl; cout << "Podaj szerokosc klatki " << endl; cout << "===>"; cin >> newdvd.szeklatki; cout << endl; cout << "Podaj wysokosc klatki " << endl; cout << "===>"; cin >> newdvd.wsklatki; system( "cls" ); cout << "-------------------------------------------------------------------------------" << endl; cout << "\t <<<< Dodales plyte >>>>" << endl; cout << "\t| Tytul :: " << newdvd.tytul << endl; cout << "\t| Czas trwania :: " << newdvd.czastrwania << " min" << endl; cout << "\t| Rok wydania :: " << newdvd.rokwyd << endl; cout << "\t| Numer katalogowy :: " << newdvd.nrkatalog << endl; cout << "\t| Rozmiar klatki :: " << newdvd.szeklatki << " x " << newdvd.wsklatki << endl; plik_dane.open( "dvd_data.txt", ios::app | ios::ate ); if( plik_dane.good() == true ) { ofstream plik_dane; plik_dane.open( "dvd_data.txt", ios::app | ios::ate | ios::out ); plik_dane << newdvd.tytul << "\r\n"; plik_dane << newdvd.czastrwania << "\r\n"; plik_dane << newdvd.rokwyd << "\r\n"; plik_dane << newdvd.nrkatalog << "\r\n"; plik_dane << newdvd.szeklatki << "\r\n"; plik_dane << newdvd.wsklatki << "\r\n"; plik_dane << "\r\n"; plik_dane.close(); } else cout << "Blad odczytu pliku!" << endl; goto start; break; case 2: cout << "Wybrales usuwanie plyt" << endl; cout << "--------------------------------------------------------------" << endl << endl; break; case 3: cout << "Wybrales sortowanie plyt" << endl; cout << "--------------------------------------------------------------" << endl << endl; break; case 4: cout << "Wybrales wyszukiwanie plyt" << endl; cout << "--------------------------------------------------------------" << endl << endl; void szukajWszystkichFraz(); break; case 5: system( "cls" ); cout << endl; cout << "\t----------------------------------------------------------" << endl; cout << "\t----- Aby zakonczyc dzialanie programu nacisnij ENTER----- " << endl; cout << "\t----------------------------------------------------------" << endl << endl; koniec = 0; break; } } while( koniec = 0 ); return 0; }
|
|
« 1 » 2 |