[C++] Obsługa pliku binarnego - źle działa odczyt lub zapis
Ostatnio zmodyfikowano 2013-05-20 14:05
sprd123 Temat założony przez niniejszego użytkownika |
[C++] Obsługa pliku binarnego - źle działa odczyt lub zapis » 2013-05-19 22:17:01 Witam! Ulepszylem mój i tak nie dzialajacy program w wartosc maksymalna stanu konta. Niestety. Wczytanie funkcji za to odpowiedzialnej wypisuje osobe (niestety nie ta z maksymalnymi zarobkami) i konczy sie errorem programu. Czemu? Moze ktos spojrzy i odpowie? #include <iostream> #include <fstream> using namespace std;
struct dane { char imie[ 30 ]; char nazwisko[ 30 ]; float stan_konta; };
void utworz_plik() { int i = 1; dane a; char znak; ofstream dane( "dane.bin", ios::binary ); do { cout << "Osoba " << i << ":" << endl << endl; cout << "Podaj imie:" << endl; cin >> a.imie; cout << "Podaj nazwisko:" << endl; cin >> a.nazwisko; cout << "Podaj stan konta:" << endl; cin >> a.stan_konta; cout << endl << endl; dane.write(( char * ) & a, sizeof( dane ) ); cout << "Czy chcesz wprowadzic kolejna osobe? , T/t" << endl << endl; cin >> znak; i++; } while( znak == 'T' || znak == 't' ); dane.close(); }
void dopisz_osobe() { dane a; int i = 1; char znak; fstream dane( "dane.bin", ios::binary | ios::app ); do { cout << "Podaj imie:" << endl; cin >> a.imie; cout << "Podaj nazwisko:" << endl; cin >> a.nazwisko; cout << "Podaj stan konta:" << endl; cin >> a.stan_konta; cout << endl << endl; dane.write(( char * ) & a, sizeof( dane ) ); cout << "Czy chcesz podac kolejna osobe? , T/t" << endl << endl; cin >> znak; i++; } while( znak == 't' || znak == 'T' ); dane.close(); }
void wyswietl() { int numer; dane a; cout << endl << endl; cout << "Od ktorej osoby chcesz wyswietlic baze? (podaj numer):" << endl; cin >> numer; fstream dane( "dane.bin", ios::binary | ios::in ); dane.seekg(( numer - 1 ) * sizeof( dane ), ios::beg ); while( !dane.eof() ) { dane.read(( char * ) & a, sizeof( dane ) ); if( dane.good() ) { cout << "Imie:" << endl; cout << a.imie << endl; cout << "Nazwisko:" << endl; cout << a.nazwisko << endl; cout << "Stan konta:" << endl; cout << a.stan_konta << endl; } } dane.clear(); dane.close(); }
void max() { dane max, a; int i = 1; fstream dane( "dane.bin", ios::in | ios::binary ); while( !dane.eof() ) { dane.read(( char * ) & a, sizeof( dane ) ); if( dane.good() ) { if( i == 1 ) max = a; else if( a.stan_konta > max.stan_konta ) max = a; i++; } } dane.clear(); dane.close(); cout << "Osoba, ktora zarabia najwiecej to:" << endl << endl; cout << max.imie << " " << max.nazwisko << endl << endl; cout << "Stan konta tej osoby to:" << endl; cout << max.stan_konta << endl << endl; }
int main() { int wybor, ilosc; cout << "Witaj w programie!" << endl << endl << endl; cout << "Wybierz:" << endl; cout << "[1] - aby utworzy nowa baze danych" << endl; cout << "[2] - aby dopisac osoby do bazy danych" << endl; cout << "[3] - aby wyswietlic osobe, ktora ma najwiekszy stan konta" << endl; cout << "[4] - aby wyswietlic dane osob z bazy od podanego numeru" << endl; cout << "[5] - aby zapisac do pliku tekstowego dane tych osob" << endl; cout << " ,ktorych stan konta jest wiekszy lub rowny od zadanego progu" << endl; cin >> wybor; cout << endl << endl; switch( wybor ) { case 1: utworz_plik(); break; case 2: dopisz_osobe(); break; case 3: max(); break; case 4: default: cout << "Niewlasciwy wybor!" << endl << endl; } return 0; }
Pozdrawiam! |
|
Monika90 |
» 2013-05-19 22:46:35 zapisywanie jest źle: ofstream dane( "dane.bin", ios::binary ); ^^^^ do { cout << "Osoba " << i << ":" << endl << endl; cout << "Podaj imie:" << endl; cin >> a.imie; cout << "Podaj nazwisko:" << endl; cin >> a.nazwisko; cout << "Podaj stan konta:" << endl; cin >> a.stan_konta; cout << endl << endl; dane.write(( char * ) & a, sizeof( dane ) ); ^^^^
używasz tej samej nazwy dane dla struktury i dla pliku, sizeof( dane ) to u ciebie rozmiar obiektu typu ofstream, a nie struktry dane. Ten sam błąd w pozostałych funkcjach. |
|
sprd123 Temat założony przez niniejszego użytkownika |
» 2013-05-19 22:58:52 To nie do wiary, ze taki ze mnie glupek. Przeciez to logiczne ze to powoduje blad a ja na to nie wpadlem. No nic, przyjmijmy, ze to przez juz pozna pore.
Pozdrawiam i serdecznie dziekuje! :)
Ps.
Czy istnieje jakas funkcja, ktora policzy mi od poczatku do konca ilosc bitow w pliku. Jest mi to potrzebne, gdyz potem podzielilbym sobie to to przez liczbe bitow zarezerwowana na strukture i dostal bym konkretny numer osoby do dopisania co jest mi potrzebne....
Pozdrawiam! |
|
pekfos |
» 2013-05-20 14:05:20 Masz na myśli bajty? gdyz potem podzielilbym sobie to to przez liczbe bitow zarezerwowana na strukture i dostal bym konkretny numer osoby do dopisania co jest mi potrzebne.... |
Na pewno da się to zrobić inaczej ;) Ale odpowiadając na pytanie: Jest, tellg()/tellp() zwracają pozycję w pliku, więc jeśli jesteś na końcu pliku, to możesz w ten sposób pobrać rozmiar. |
|
« 1 » |