wczytywanie danych z pliku txt i ich wyrzucanie, poszukiwanie ze wzgl na dany parametr
Ostatnio zmodyfikowano 2014-03-29 18:06
Spiritualself Temat założony przez niniejszego użytkownika |
wczytywanie danych z pliku txt i ich wyrzucanie, poszukiwanie ze wzgl na dany parametr » 2014-03-29 09:46:09 Witam, mam problem z programem bazodanowym gromadzącym informacje o flocie pojazdów w firmie. 1) Muszę wyprowadzić dane z pliku pod nazwą pojazdy.txt na ekran, jednak żadne ifstream plik; plik.open("pojazdy.txt")/ czy /void open( const char * pojazdy, ios_base::openmode input ) nie działają. 2) Jednym z wymagań jest poszukiwanie pojazdów w oparciu o markę i od kilku godzin siedzę i zastanawiam się jak zrobić, gdyż informatyka to nie mój konik :P #include <iostream> #include <string> #include <fstream> #include <conio.h> #include <cstdlib>
using namespace std;
int i;
struct Pojazdy { string model, marka; float pojemnosc; int rok; long int przebieg; float cena; };
Pojazdy dane[ 500 ];
void Dodaj(); void Zapisz(); void Edytuj(); void Baza(); void Usun();
int main() { int w; short x; cout << "\n W programie zamiast samochodow znajduja sie motocykle!!" << endl; cout << "\n 1:Aby wczytac dane o motocyklach z pliku pojazdy.txt"; cout << "\n 2:Aby utworzyc pusty plik "; cout << "\n\n\tPodaj nr opcji: "; cin >> x; fstream plik; <----dok ł adnie w tym miejscu zaczynaj ą si ę moje problemy z wyrzuceniem pliku if( x == 1 ) { void open( const char * pojazdy, ios_base::openmode input ); if( !plik ) { cerr << "\n Blad odczytu/brak znalezionego pliku. Program zostanie zatrzymany" << endl; system( "pause" ); return 0; } else { int j = 0; do { plik >> dane[ j ].marka; plik >> dane[ j ].model; plik >> dane[ j ].pojemnosc; plik >> dane[ j ].rok; plik >> dane[ j ].przebieg; plik >> dane[ j ].cena; j++; } while( !plik.eof() ); cout << "\n\n\tWczytano dane. Nacisnij ENTER!"; getchar(); getchar(); } } system( "cls" ); cout << "\n\n\t\t"; do { cout << "\n Obecnie w bazie znajduja sie " << i << " jednosladow \n\n"; cout << "\n 1.Dodaj nowe dane\n"; cout << "\n 2. Zapis wprowadzonych danych\n"; cout << "\n 3. Edycja danych\n"; cout << "\n 4. Odtworz zawartosc bazy\n"; cout << "\n 5. Usun wpis z bazy\n"; cout << "\n 6. zakonczenie programu\n "; cout << "\n\t Wybierz opcje: "; cin >> w; if( w < 0 || w > 5 ) { system( "cls" ); cout << "\n\n\n\t Niestety nie ma takiej opcji. Prosze wybrac opcje oznaczona liczbami od 1 do 5"; cout << "\n\n\n\t\tDzialanie programu zakonczono\n\n"; system( "pause" ); return 0; }; switch( w ) { case 0: cout << "Dzialanie programu zakonczono\n "; system( "pause" ); return 0; break; case 1: Dodaj(); break; case 2: Zapisz(); break; case 3: Edytuj(); break; case 4: Baza(); break; case 5: Usun(); break; } system( "cls" ); } while( w != 0 ); cin.ignore(); getchar(); return 0; }
void Wczytaj() { ifstream plik( "pojazdy.txt", ios::in ); plik >> i; if( !plik ) { cout << "\n\n\t\tBrak pliku - program zostanie zakonczony"; cout << "\n\n\t\t"; system( "pause" ); } else { int j = 0; do { plik >> dane[ j ].marka; plik >> dane[ j ].model; plik >> dane[ j ].pojemnosc; plik >> dane[ j ].rok; plik >> dane[ j ].przebieg; plik >> dane[ j ].cena; j++; } while( !plik.eof() ); cout << "\n\n\tWczytano dane. Nacisnij ENTER!"; getchar(); getchar(); } }
void Dodaj() { cout << "\n\n\t\tPodaj marke motocykla : "; cin >> dane[ i ].marka; cout << "\n\n\t\tPodaj model motocykla : "; cin >> dane[ i ].model; cout << "\n\n\t\tPodaj pojemnosc motocykla w cm szesciennych: "; cin >> dane[ i ].pojemnosc; cout << "\n\n\t\tPodaj rocznik motocykla: "; cin >> dane[ i ].rok; cout << "\n\n\t\tPodaj przebieg motocykla: "; cin >> dane[ i ].przebieg; cout << "\n\n\t\tPodaj cene motocykla: "; cin >> dane[ i ].cena; i++; cin.ignore(); cout << "\n\n\t\tWcisnij dowolny klawisz"; getchar(); }
void Zapisz() { ofstream plik( "baza.txt", ios::trunc ); plik << i << "\n"; for( int j = 0; j < i; j++ ) { plik << dane[ j ].marka << "\n"; plik << dane[ j ].model << "\n"; plik << dane[ j ].rok << "\n"; plik << dane[ j ].przebieg << "\n"; plik << dane[ j ].cena << "\n"; } cout << "\n\n\t\tDane zostaly zapisane! \n\n\t\t"; system( "pause" ); }
void Baza() { int j; system( "cls" ); if( i != 0 ) { cout << "\n\n\n"; for( j = 0; j < i; j++ ) { cout << "~~~~~~~~~~~~~~Wyswietlam wprowadzone dane~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl; cout << "x Podaj numer jednosladu aby wyswietlic dane o nim " << j + 1 << ": \n"; cout << "x Marka motocykla: " << dane[ j ].marka << "\n"; cout << "x Model motocykla: " << dane[ j ].model << "\n"; cout << "x pojemnosc motocykla: " << dane[ j ].pojemnosc << "\n"; cout << "x Rocznik motocykla: " << dane[ j ].rok << "\n"; cout << "x przebieg motocykla: " << dane[ j ].przebieg << "\n"; cout << "x cena motocykla: " << dane[ j ].cena << "\n"; cout << "x"; cout << "~~~~~~~~~~~~To wszystkie dane na temat wybranego przez Ciebie pojazdu~~~~~~~~~~~~~~" << endl; } } else cout << "\n\nNie ma zadanego motocykla w bazie\n\n\t\t"; system( "pause" ); }
void Edytuj() { int nr; if( i != 0 ) { system( "cls" ); cout << "\n\n\t\tPodaj numer motocykla, ktory chcesz edytowac: "; cin >> nr; nr = nr - 1; cin.ignore(); if( nr < 0 || nr > i ) { system( "cls" ); cout << "\n\n\t\tNie mozna wykonac operacji - brak danych\n\n\t\t"; system( "pause" ); } else { system( "cls" ); cout << "\n\n\t\tPodaj marke motocykla:"; cin >> dane[ nr ].marka; cout << "\n\n\t\tPodaj model motocykla:"; cin >> dane[ nr ].model; cout << "\n\n\t\tpodaj pojemnosc motocykla:"; cin >> dane[ nr ].pojemnosc; cout << "\n\n\t\tPodaj rocznik motocykla: \n"; cin >> dane[ nr ].rok; cout << "\n\n\t\tPodaj przebieg motocykla: \n"; cin >> dane[ nr ].przebieg; cout << "\n\n\t\tPodaj cene motocykla: \n"; cin >> dane[ nr ].cena; cout << "\n\n\t\tMotocykl " << nr + 1 << " został zmieniony!\n\n\t\t"; cin.ignore(); getchar(); Zapisz(); } } else { system( "cls" ); cout << "\n\n\t\t Nie ma pojazdow w bazie. Nacisnij dowolny klawisz"; system( "pause" ); } }
void Usun() { int nr; cout << "\n\n\t Podaj numer pojazdu, ktorego chcesz usunac: "; cin >> nr; nr = nr - 1; cin.ignore(); if( i != 0 ) { if( nr > i ) { cout << "\n\n\t\t Operacja nie moze byc wykonana brak motocykla o takim numerze"; getchar(); } else { for( short w = nr; w < i; w++ ) { dane[ w - 1 ].marka = dane[ w ].marka; dane[ w - 1 ].model = dane[ w ].model; dane[ w - 1 ].pojemnosc = dane[ w ].pojemnosc; dane[ w - 1 ].rok = dane[ w ].rok; dane[ w - 1 ].przebieg = dane[ w ].przebieg; dane[ w - 1 ].cena = dane[ w ].cena; } i--; system( "cls" ); cout << "\n\n\tPojazd o numerze " << nr << " zostal usuniety"; getchar(); Zapisz(); } } else { cout << "\n\n\t\tNie ma pojazd w bazie. Wcisnij ENTER aby zamknac!"; getchar(); } }
plik pojazdy.txt: BMW G 650 652 2011 5 651 21 500 BMW GS 1001 2012 12900 65 900 HARLEY-DAVIDSON FAT BOY 1001 1999 43000 32 400 SUZUKI GLADIUS 645 2010 15400 16 900 SUZUKI HAYABUSA 1340 2013 12000 42900 TRIUMPH SPEED TRIPLE 1050 2011 21000 33800 TRIUMPH TIGER EXPLORER XC 1215 2014 3300 60 400 YAMAHA YZ 250F 250 2009 2020 12900 KTM SX 450 2006 32 800 8 200 KAWASAKI Z800 800 2014 1430 31900 SUZUKI GSR 600 600 2006 1795 19400 KAWASAKI ZZR 1400 2011 6500 35000 KTM DUKE 690 654 2008 9500 17799 YAMAHA R1 1000 2005 13000 16900 YAMAHA FJR 1300 2009 6800 41 900 YAMAHA XVS STRYKER 1300 2011 1200 29000 SUZUKI GS 500 500 1993 42000 3099 HONDA CBR 600 600 1999 39345 7 900 YAMAHA DT 51 1999 54000 4000 DUCATI MONSTER 696 696 2011 5800 22000 [/i] |
|
OczkoSX |
» 2014-03-29 13:27:00 Kod podajemy w znacznikach ["cpp"] ["/cpp"] |
|
colorgreen19 |
» 2014-03-29 15:25:01 w funkcji wczytaj() masz cos takiego: ifstream plik( "pojazdy.txt", ios::in ); plik >> i; jak wczesniej deklarowales i to zmienna globalna tylu int Jezeli dane w pliku sa dokladnie tak jak podales to probojesz pobrac liczbe z 1 lini pliku, jednak tam stoi napis BMW. Wnioskujac strumien ustwaia ci flage bledu i odmawia dalszej wspolpracy. |
|
Spiritualself Temat założony przez niniejszego użytkownika |
» 2014-03-29 16:49:35 ZmieniłAm więc wyrzucanie pliku fstream plik;
if( z == 1 ) { char tekst[ 100 ]; fstream plik( "pojazdy.txt", ios::in | ios::out | ios::ate ); plik.close(); plik.open( "pojazdy.txt" ); while( !plik.eof() ) { plik.getline( tekst, 100 ); cout << tekst << endl; } plik.close(); system( "PAUSE" ); EXIT_SUCCESS; if( !plik ) { cerr << "\n Blad odczytu/brak znalezionego pliku. Program zostanie zatrzymany" << endl; system( "pause" ); return 0; }
(dziękuje OczkoSX za zwrócenie uwagi) Mam tylko problem z tym, że po wczytaniu pliku wyskakują jego dane a po naciśnięciu klawisza program nie zamyka się lecz wyskakuje komunikat "Blad odczytu/brak znalezionego pliku[...]". Nie wiem jak to zmienić, gdyż po usunięciu wyskakują dwa błędy typu "cout does not name a type" czy "expected unqualified-id before do". |
|
colorgreen19 |
» 2014-03-29 17:23:02 przepraszam za nie zwrócenie uwagi na plec, nieprzespana noc i troche mam "oczopląs"... "Przelećmy" sobie wzrokiem kod. otwierasz plik konstruktorem, po czym odrazu go zamykasz // niepotrzebne jest to zamkniecie i ponowne otworzenie strumienia // wczytujesz to tablicy char linijki z pliku dopóki nie bedzie jego konca,// w petli równiez wyświetlasz zawartość tego pliku zamykasz strumien (czyli konczysz prace) pliku pause'ujesz konsole, zwracasz zakonczenie programu. Jest to teoretycznie koniec programu i nie powinno sie dalej nic robic, jednak to jest c++ i sie robi (też nie wiem dlaczego ;]). Co się robi? Mianowicie sprawdzasz czy strumien z pliku jest (chyba,//przepraszam nie pamietam//) otwarty i jest bez błędu. Skoro zamknełaś strumien 5 linijek wczensiej to zwraca false, czyli wyswietla ci twoj napisany (tego cerr a) błąd. //konsola sie ponownie pause'uje i jest znowu zwracany koniec programu. Jeżeli chcesz, aby sie wyłączał od razu (jak zrozumiałem) to usuń linijke system("PAUSE"). Jeżeli chcesz aby ten warunek "naprawde" działał musisz go umieśćic tuż po otwarciu pliku, a przed wczytywaniem danych (nobo mogą być uszkodzone albo coś...) |
|
Spiritualself Temat założony przez niniejszego użytkownika |
» 2014-03-29 18:06:31 Dziękuję ślicznie za pomoc, Colorgreen19 :) |
|
« 1 » |