Wyszukiwanie w tekście między klamrami?
Ostatnio zmodyfikowano 2014-09-26 16:23
JemKanapke Temat założony przez niniejszego użytkownika |
Wyszukiwanie w tekście między klamrami? » 2014-09-25 14:13:24 Witam serdecznie:) Muszę napisać kod wyszukujący podaną linijkę w pliku, i zwracający numer znalezionej linii. Lecz jest jeden warunek, szukanie linii musi być wykonywane po liniach zawierających "[" , "]" , "[". Tzn. ma szukać w drugim nawiasie kwadratowym w pliku... Przykład pliku:
[ //każdy znak "[" lub "]" jest w osobnej linii !
//jakiś tekst
] [ //od tego nawiasu ma zacząć szukać
jakiś tekst
] //tu kończy szukanie
Nie wiem czy nie namieszałem... ;/ Więc tak, macie jakieś propozycje co do najszybszego wyszukania podanych linii? Dodam iż nie wchodzi w grę wczytanie całego pliku... ;/ Będę baaaardzo wdzięczny za jakiekolwiek sugestię! Pozdrawiam. JemKanapke :D |
|
pekfos |
» 2014-09-25 14:18:49 Wczytuj po jednej linii i porównuj z tymi nawiasami. Algorytm jest banalny. |
|
JemKanapke Temat założony przez niniejszego użytkownika |
» 2014-09-25 14:30:00 Jestem początkujący... :) Naskrobałem coś takiego lecz nie działa? Tzn. wyszukuję także poza nawiasami...;/ void szukanie_plik( string szukany ) { int i = 1, a = 0, b = 0; fstream plik; plik.open( "plik", ios::in ); if( plik.good() ) { string linia; while( !plik.eof() ) { getline( plik, linia ); if( linia == "[" ) a++; else if( linia == "]" ) b++; else if(( linia == szukany ) &&( a = 2 ) &&( b = 1 ) ) { cout << "Znaleziono w linii nr.: " << i << endl; } i++; } plik.close(); } else cout << "Error! Nie udalo otworzyc sie pliku!" << endl; }
Edit Już działa. W else if((linia==szukany)&&(a=2)&&(b=1)) dałem "=" zamiast "==". Da rade jeszcze coś wywalić? Dodałem jeszcze możliwość wyboru klamry w której ma szukać... void szukanie_plik(string szukany,int nr_klamry) { fstream plik; plik.open( "plik", ios::in ); if( plik.good() ) { int i=1,a=0,b=0; //a-"[" b-"]" string linia; while( !plik.eof() ) { getline( plik, linia ); if(linia=="[")a++; else if(linia=="]")b++; else if((linia==szukany)&&(a==nr_klamry)&&(b==nr_klamry-1)) { cout<<"Znaleziono w linii nr.: "<<i<<endl; } i++; } plik.close(); } else cout << "Error! Nie udalo otworzyc sie pliku!" << endl; }
hmm nie mam pojęcia co jeszcze wywalić... Jakieś sugestie?? |
|
libed |
» 2014-09-25 17:24:33 if( linia == "[" ) a++; Wystarczy jedna niewinna spacja, żeby warunek nie został spełniony. if( linia.find( '[' ) != string::npos ) było by lepsze, |
|
JemKanapke Temat założony przez niniejszego użytkownika |
» 2014-09-26 13:35:36 libed Faktycznie wystarczyła jedna spacja aby program nie zadziałał. Dobra, jeszcze wkleję poprawny kod. Może będzie komuś kiedyś potrzebny :)) int szukanie_klamra_plik( string adres, string szukany, int nr_klamry ) { fstream plik; plik.open( adres.c_str(), ios::in ); if( plik.good() ) { int i = 1, a = 0, b = 0; string linia; while( !plik.eof() ) { getline( plik, linia ); if( linia.find( '[' ) != string::npos ) a++; else if( linia.find( ']' ) != string::npos ) b++; else if(( linia.find( szukany ) != string::npos ) &&( a == nr_klamry ) &&( b == nr_klamry - 1 ) ) { return( i ); } i++; } plik.close(); } else return( 0 ); }
Jestem bardzo wdzięczny za pomoc.:) Do zamknięcia! |
|
libed |
» 2014-09-26 16:23:27 Argumenty nazwy pliku i szukanej frazy możesz, a nawet powinieneś przekazać jako stałe referencje ;) Nie wiem czy konieczne jest również liczenie klamr zamykających. Poza tym otwieraniem pliku powinna zajmować się oddzielna funkcja. Tak samo brakuje trochę sprawdzania czy w pliku istnieje co najmniej tyle bloków ile jest podane w trzecim argumencie.
Co jeśli w tekst między klamrami będzie sam w sobie zawierał klamry? ;) |
|
« 1 » |