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

[C++] Obsługa pliku binarnego - źle działa odczyt lub zapis

Ostatnio zmodyfikowano 2013-05-20 14:05
Autor Wiadomość
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?

C/C++
#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!
P-83365
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.
P-83371
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!
P-83372
pekfos
» 2013-05-20 14:05:20
bitow w pliku.
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.
P-83407
« 1 »
  Strona 1 z 1