Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wyszukiwanie w tekście między klamrami?

Ostatnio zmodyfikowano 2014-09-26 16:23
Autor Wiadomość
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
P-117508
pekfos
» 2014-09-25 14:18:49
Wczytuj po jednej linii i porównuj z tymi nawiasami. Algorytm jest banalny.
P-117510
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...;/
C/C++
void szukanie_plik( string szukany )
{
    int i = 1, a = 0, b = 0; //a-"[",   b-"]"
    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??
P-117513
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,
P-117530
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 :))
C/C++
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; //a-"["      b-"]"
        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!
P-117593
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? ;)
P-117603
« 1 »
  Strona 1 z 1