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

Wyszukiwanie tekstu w pliku txt

Ostatnio zmodyfikowano 2011-11-27 21:39
Autor Wiadomość
El-Pablo
Temat założony przez niniejszego użytkownika
Wyszukiwanie tekstu w pliku txt
» 2011-11-26 22:31:33
Witam mam mały kłopot może mi ktoś pomoże napisałem program który zapisuje dane ( ksiazka telefoniczna ) do pliku, i teraz chodzi o fukcje znajdz(), uzytkownik podaje nazwe programu i 2 parametry nazwe pliku i szukane słowo i wszystko ładnie znajduje po nazwisku znajduje po imieniu ale jezeli uzytkownik wpisze numer to jest to zmienna string a w strukturze mam zmienna int, zrobiłem konwersje ze stringa na int ale i tak nie wyszukuje tylko wywala program, mam to zrobic na zajecia moze ktos zerknie na kod i mi powie gdzie lezy przyczyna, z góry dziekuje o to kod (chodzi tylko o funkcje "znajdz":

C/C++
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;
struct osoba
{
    string imie;
    string nazwisko;
    int telefon;
    osoba * next;
};
osoba * poczatek = NULL;
const char * nazwa_pliku;
string slowo;
void dodaj()
{
    osoba * nowa = new osoba;
    cout << "Wpisz imie ";
    cin >> nowa->imie;
    cout << "Wpisz nazwisko ";
    cin >> nowa->nazwisko;
    cout << "Wpisz telefon ";
    cin >> nowa->telefon;
    nowa->next = NULL;
    if( poczatek == NULL )
    {
        poczatek = nowa;
    } else
    {
        osoba * szukaj = poczatek;
        while( szukaj->next != NULL )
        {
            szukaj = szukaj->next;
        }
        szukaj->next = nowa;
    }
}
void wyswietl()
{
    if( poczatek != NULL )
    {
        osoba * pokaz = poczatek;
        while( pokaz->next != NULL )
        {
            cout << endl << pokaz->imie;
            cout << endl << pokaz->nazwisko;
            cout << endl << pokaz->telefon << endl;
            pokaz = pokaz->next;
        }
        cout << endl << pokaz->imie;
        cout << endl << pokaz->nazwisko;
        cout << endl << pokaz->telefon << endl;
    }
}
void szukaj()
{
    int a;
    cout << " Podaj numer szukanego telefonu : ";
    cin >> a;
    osoba * szuk = poczatek;
    while( szuk->next != NULL )
    {
        if( szuk->telefon == a )
        {
            break;
        }
        szuk = szuk->next;
    }
    if( szuk->telefon == a )
    {
        cout << endl << szuk->imie;
        cout << endl << szuk->nazwisko;
        cout << endl << szuk->telefon << endl;
    }
}
void znajdz()
{ int napis;
    fstream plik;
   
    plik.open( nazwa_pliku, fstream::in );
    if( plik.is_open() )
    { osoba * curr = poczatek;
       
        while(( curr != NULL ) &&( curr->imie != slowo ) &&( curr->nazwisko != slowo ) )
        {
            curr = curr->next;
           
        }
        if( curr->imie == slowo )
        {
            cout << "Znaleziono imie o podanej frazie\n" << curr->imie << endl;
        }
        if( curr->nazwisko == slowo )
        {
            cout << "Znaleziono nazwisko o podanej frazie\n" << curr->nazwisko << endl;
        } else
        {
            cout << "Nie znaleziono imienia i nazwiska przechodze dalej";
        }
        osoba * szukaj = poczatek;
        napis = atoi( slowo.c_str() );
        while( szukaj != NULL )
        {
           
            while( curr->telefon != napis )
            {
                szukaj = szukaj->next;
            }
            cout << "TELEFON\n" << szukaj->telefon << endl;
        }
        cout << "Nic nie znaleziono\n";
        plik.close();
       
    }
    else cout << "Nie udalo sie otworzyc pliku";
   
}
void zapisz()
{
    fstream plik( nazwa_pliku, fstream::out | fstream::app );
    if( plik.is_open() )
    {
        if( poczatek != NULL )
        {
            osoba * pokaz = poczatek;
            while( pokaz->next != NULL )
            {
                plik << pokaz->imie;
                plik << endl << pokaz->nazwisko;
                plik << endl << pokaz->telefon << endl;
                pokaz = pokaz->next;
            }
            plik << pokaz->imie;
            plik << endl << pokaz->nazwisko;
            plik << endl << pokaz->telefon << endl;
        }
        plik.close();
    }
    else cout << "Nie udalo sie otworzyc pliku";
   
}
void wczytaj()
{
    string line;
    fstream plik;
    plik.open( nazwa_pliku, fstream::in );
    if( plik.is_open() )
    {
        getline( plik, line );
        while( !plik.eof() )
        {
            osoba * nowa = new osoba;
            nowa->imie = line;
            getline( plik, line );
            nowa->nazwisko = line;
            getline( plik, line );
            nowa->telefon = atoi( line.c_str() );
            getline( plik, line );
            nowa->next = NULL;
            if( poczatek == NULL )
            {
                poczatek = nowa;
            } else
            {
                osoba * szukaj = poczatek;
                while( szukaj->next != NULL )
                {
                    szukaj = szukaj->next;
                }
                szukaj->next = nowa;
            }
        }
        plik.close();
    }
}
int main( int argc, char * argv[] )
{
    if( argc != 3 )
    {
        cout << "Zla liczba parametrow sprobuj ponownie\n";
    } else
    {
       
        nazwa_pliku = argv[ 1 ];
        slowo = argv[ 2 ];
        float pi = 3.14;
        cout << "Pi = " << pi << " adres = " << & pi << endl;
        float * addr;
        addr = & pi;
        cout << "adres = " << addr << " wartosc = " << * addr << endl;
        int a;
        while( a != 7 )
        {
            cout << "Wybierz : \n1 - dodaj osobe \n2 - wyswietl dane \n3 - wyszukaj telefon \n4 - zapisz \n5 - wczytaj \n6 - znajdz \n7 - koniec\n";
            cin >> a;
            switch( a )
            {
            case 1:
                dodaj();
                break;
            case 2:
                wyswietl();
                break;
            case 3:
                szukaj();
                break;
            case 4:
                zapisz();
                break;
            case 5:
                wczytaj();
                break;
            case 6:
                znajdz();
                break;
            }
        }
    }
    system( "PAUSE" );
    return EXIT_SUCCESS;
}
P-44791
Drraven
» 2011-11-27 09:45:16
Jak to na zajęcia to zrób od razu z numeru stringa i będzie działać :D
albo tablice stringów
C/C++
string numer[ 3 ];
numer[ 0 ] = "123";
numer[ 1 ] = "456";
numer[ 2 ] = "789";
I szukałbyś albo cały numer albo tylko część;
P-44797
El-Pablo
Temat założony przez niniejszego użytkownika
» 2011-11-27 10:38:33
właśnie zrobiłem tak ze szuka stringa najpierw w imionach i nazwiskach jeżeli nie znajdzie to przesuwa wskaźnik na początek i przez atoi zmienia stringa na int i szuka po numerze tylko ze to nie działa bo jak sie wpisze w parametrze liczbe to poprostu zamyka program :(
P-44799
malan
» 2011-11-27 10:57:52
"Strzelam", że błąd jest tutaj:
C/C++
while( curr->telefon != napis )
{
    szukaj = szukaj->next;
}
Podejrzewam, że to po prostu małe przeoczenie :)

BTW: sprawdzałeś co się dzieje kiedy w funkcji szukaj podasz numer, którego nie ma w książce?
P-44800
El-Pablo
Temat założony przez niniejszego użytkownika
» 2011-11-27 11:27:14
hmmm własnie patrzyłem, wprowadziłem numer którego nie ma w ksiazce i tak samo nic sie nie dzieje poprostu zamyka program, co najciekawsze jak podam i imie lub nazwisko które jest to znajduje a jak podam takie którego nie ma to nic nie wyświetla i także wychodzi a powinno wyświetlić if((curr->imie!=slowo) && (curr->nazwisko!=slowo)){cout<<"Nie znaleziono imienia i nazwiska przechodze dalej";}, a tego komunikatu wogóle nie wyświetla
P-44801
El-Pablo
Temat założony przez niniejszego użytkownika
» 2011-11-27 11:28:51
malan też masz racje tam powinno byc szukaj->telefon!=napis, ponieważ wskaznik szukaj przesuwam na poczatek ale to nic nie daje dalej to samo
P-44802
El-Pablo
Temat założony przez niniejszego użytkownika
» 2011-11-27 11:35:40
teraz zobaczyłem tez jeszcze jedna rzecz, po kazdym wyborze z menu pokazuje wynik i spowrotem menu a jak sie wybierze 6 czyli wyszukiwanie w pliku to czy cos znajdzie czy nie to zamyka program :/
P-44804
malan
» 2011-11-27 11:38:54
W funkcji szukaj oraz znajdz popełniasz ten sam błąd - próbujesz odczytać coś z niczego.
1.
C/C++
while( szuk->next != NULL )
{
    if( szuk->telefon == a )
    {
        break;
    }
    szuk = szuk->next;
}
Patrz punk 2.

2.
C/C++
while(( curr != NULL ) &&( curr->imie != slowo ) &&( curr->nazwisko != slowo ) )
{
    curr = curr->next;
   
}
Pomyśl co się dzieje kiedy kiedy podasz imię lub nazwisko, którego nie ma w bazie. Na co będzie wskazywał curr po wyjściu z pętli?

3.
C/C++
while( curr->telefon != napis )
{
    szukaj = szukaj->next;
}
To jest pętla nieskończona, jeżeli podałeś numer telefonu, którego nie ma w bazie. Każesz programowi szukać numeru dopóki go nie znajdzie, a przecież baza NIE jest nieograniczona - kiedyś się kończy prawda?

4. Po co otwierasz plik w funkcji znajdz?
5. Istnieje opcja "Edytuj" :)
P-44805
« 1 » 2
  Strona 1 z 2 Następna strona