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": #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; } |
|
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 string numer[ 3 ]; numer[ 0 ] = "123"; numer[ 1 ] = "456"; numer[ 2 ] = "789"; I szukałbyś albo cały numer albo tylko część; |
|
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 :( |
|
malan |
» 2011-11-27 10:57:52 "Strzelam", że błąd jest tutaj: 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? |
|
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 |
|
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 |
|
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 :/ |
|
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. while( szuk->next != NULL ) { if( szuk->telefon == a ) { break; } szuk = szuk->next; } Patrz punk 2. 2. 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. 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" :) |
|
« 1 » 2 |