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

Wyswietlanie zawartosci pliku od pewnego miejsca. Gdzie popełniłem błąd w kodzie?

Ostatnio zmodyfikowano 2013-05-22 21:52
Autor Wiadomość
sprd123
Temat założony przez niniejszego użytkownika
Wyswietlanie zawartosci pliku od pewnego miejsca. Gdzie popełniłem błąd w kodzie?
» 2013-05-19 21:15:49
Witam!

Mam w programie zrobic odczyt pliku od pewnego miejsca.

Niestety cos nie chce działać. Nie będe się rozpisywał. Wkleję kod i jeżeli ktoś jest na tyle miły i chętny , niech udzieli mi jakiejś wskazów gdyż musze to zrobić na jutro na labolatoria.

Chodzi mi o funkcję wczyta()

C/C++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

struct dane
{
    string imie, nazwisko;
    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 b;
    int i = 1;
    char znak;
    fstream dane( "dane.bin", ios::binary | ios::app );
   
    do
    {
        cout << "Osoba " << i << endl << endl;
        cout << "Podaj imie:" << endl;
        cin >> b.imie;
        cout << "Podaj nazwisko:" << endl;
        cin >> b.nazwisko;
        cout << "Podaj stan konta:" << endl;
        cin >> b.stan_konta;
        cout << endl << endl;
       
        dane.write(( char * ) & b, 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 c;
   
   
    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 * ) & c, sizeof( dane ) );
       
        if( dane.good() )
        {
            cout << "Imie:" << endl;
            cout << c.imie;
            cout << "Nazwisko:" << endl;
            cout << c.nazwisko;
            cout << "Stan konta:" << endl;
            cout << c.stan_konta;
        }
       
    }
   
    dane.clear();
    dane.close();
   
}

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 dane osob z bazy od podanego numeru" << endl;
    cout << "[4] - 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:
        wyswietl();
        break;
       
    case 4:
       
    default:
        cout << "Niewlasciwy wybor!" << endl << endl;
       
       
    }
    return 0;
}
P-83349
Monika90
» 2013-05-19 21:21:37
dane.write(( char * ) & a, sizeof( dane ) );
W ten sposób nie można zapisywać struktur, które zawierają std::string, było o tym na forum całkiem niedawno.
P-83351
sprd123
Temat założony przez niniejszego użytkownika
» 2013-05-19 21:28:11
Tak faktycznie, zanim napisalas to udalo mi sie do tego dojsc. Ale niestety dalej nie dziala:

zmienilem strukture:

C/C++
struct dane
{
    char imie[ 20 ];
    char nazwisko[ 20 ];
    float stan_konta;
};

W sensie juz program sie nie blokuje ale pokazuje jakies krzaczki :(


Oczywiscie wiem, ze mozna to zrobic inaczej ale ja chce uzyc funkcji seekg, seekp, tego od nas wymagaja :(

Prosze o pomoc :)
P-83352
DejaVu
» 2013-05-22 21:52:57
Zarzuć poprawionym kodem, bo tak na pierwsze scrollnięcie wygląda poprawnie (uwzględniając zmianę std::string na char[20]).
P-83627
« 1 »
  Strona 1 z 1