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

Pliki w trybie binarnym, projekt w C++

Ostatnio zmodyfikowano 2014-01-13 21:39
Autor Wiadomość
Yourin
Temat założony przez niniejszego użytkownika
Pliki w trybie binarnym, projekt w C++
» 2014-01-13 19:34:25
Witam. Mam problem z projektem na programowanie, jest to dziennik lekcyjny, co prawda jeszcze zostało sporo do zrobienia, ale już napotkałem problemy nieznanego pochodzenia, otóż jest problem z funkcją lista() i dane(), w pierwszym przypadku czasem wyświetla listę uczniów, czasem nie, jak wysłałem do kolegi, żeby uruchomił to nie zadziałało w ogóle "Program przestał działać". Funkcja dane natomiast nie wyświetla właściwych danych, tylko krzaczki i losowe cyfry. Czy ktoś wie co tu jest nie tak? Kod wydaje się w porządku, ale jeszcze nawet nie miałem tematu plików w tym trybie na zajęciach i może po prostu nie widzę błędu.


C/C++
#include <iostream>
#include <fstream>

using namespace std;

void menu();
void dodaj();
void lista();
void dane();
void zagrozeni();

struct adr
{
    char miasto[ 20 ];
    char ulica[ 20 ];
    int numer;
};

struct uczniowie
{
    char imie[ 20 ];
    char nazwisko[ 20 ];
    adr adres;
    int telefon;
    char ojciec[ 20 ];
    char matka[ 20 ];
    int oceny;
};

int main()
{
    menu();
}

void lista()
{
    uczniowie uczen;
    int i = 1;
    ifstream plik( "uczniowie.dat", ios::binary | ios::in );
    while( 1 )
    {
        plik.read( reinterpret_cast < char *>( & uczen ), sizeof( uczen ) );
        if( plik.eof() ) break;
       
        cout << i << " " << uczen.imie << " " << uczen.nazwisko << endl;
        i++;
    }
    plik.close();
   
}

void dane()
{
    uczniowie uczen;
    int wybor;
    cout << "Dane ktorego ucznia chcesz wyswietlic?" << endl;
    cin >> wybor;
    if( cin.good() == 0 )
    {
        while( cin.good() == 0 )
        {
            cin.clear();
            cin.sync();
            cout << "Podano bledna liczbe, wprowadz ja raz jeszcze: ";
            cin >> wybor;
        }
    }
    ifstream plik( "uczniowie.dat", ios::binary | ios::in );
    plik.seekg( sizeof( struct uczniowie ) *( wybor - 1 ) );
    plik.read( reinterpret_cast < char *>( & uczen ), sizeof( uczen ) );
    cout << "Uczen " << uczen.imie << " " << uczen.nazwisko
    << endl
    << "Adres " << uczen.adres.miasto << " " << uczen.adres.ulica << " " << uczen.adres.numer
    << endl
    << "Numer telefonu " << uczen.telefon
    << endl
    << "Rodzice " << uczen.ojciec << " " << uczen.matka
    << endl
    << uczen.oceny
    << endl << endl;
    plik.close();
}

void zagrozeni()
{
    cout << "W budowie" << endl;
}

void dodaj()
{
    int liczba;
    cout << " Ilu uczniow chcesz dodac do listy?" << endl;
    cin >> liczba;
    if( cin.good() == 0 )
    {
        while( cin.good() == 0 )
        {
            cin.clear();
            cin.sync();
            cout << "Podano bledna liczbe, wprowadz ja raz jeszcze: ";
            cin >> liczba;
        }
    }
    uczniowie uczen;
    ofstream plik( "uczniowie.dat", ios::out | ios::app | ios::binary );
    for( int i = 0; i < liczba; i++ )
    {
        cout << " Uczen numer " << i + 1
        << endl;
        cout << " Nazwisko : ";
        cin >> uczen.nazwisko;
        cout << endl;
        cout << " Imie: ";
        cin >> uczen.imie;
        cout << endl;
        cout << " Miasto: ";
        cin >> uczen.adres.miasto;
        cout << endl;
        cout << " Ulica: ";
        cin >> uczen.adres.ulica;
        cout << endl;
        cout << " Numer domu: ";
        cin >> uczen.adres.numer;
        cout << endl;
        cout << " Numer telefonu: ";
        cin >> uczen.telefon;
        cout << endl;
        cout << " Imie matki: ";
        cin >> uczen.matka;
        cout << endl;
        cout << " Imie ojca: ";
        cin >> uczen.ojciec;
        cout << endl;
        cout << " Oceny: ";
        cin >> uczen.oceny;
        cout << endl;
        cout << endl;
        plik.write( reinterpret_cast < char *>( & uczen ), sizeof( uczen ) );
    }
    plik.close();
}

void menu()
{
    int wybor1, wybor2;
    do
    {
        cout << "\t\t***** DZIENNIK LEKCYJNY ***** " << endl;
        cout << "\t[1] MENU " << endl;
        cout << "\t[0] KONIEC PROGRAMU" << endl;
        cin >> wybor1;
        if( cin.good() == 0 )
        {
            while( cin.good() == 0 )
            {
                cin.clear();
                cin.sync();
                cout << "Podano bledna liczbe, wprowadz ja raz jeszcze: ";
                cin >> wybor1;
            }
        }
        if( wybor1 == 1 )
        {
            cout << "\t\t      MENU"
            << endl
            << "\t  Prosze o wybranie dzialania:"
            << endl
            << "\t  [1] Dodanie ucznia do listy" //
            << endl
            << "\t  [2] Wyswietlenie listy uczniow"
            << endl
            << "\t  [3] Wyswietlanie danych ucznia" //
            << endl
            << "\t  [4] Generowanie listy zagrozonych osob"
            << endl
            << "\t  [0] Koniec programu"
            << endl
            << endl;
            cin >> wybor2;
            if( cin.good() == 0 )
            {
                while( cin.good() == 0 )
                {
                    cin.clear();
                    cin.sync();
                    cout << "Podano bledna liczbe, wprowadz ja raz jeszcze: ";
                    cin >> wybor2;
                }
            }
            switch( wybor2 )
            {
            case 1:
                {
                    dodaj();
                    break;
                }
            case 2:
                {
                    lista();
                    break;
                }
            case 3:
                {
                    dane();
                    break;
                }
            case 4:
                {
                    zagrozeni();
                    break;
                }
            case 0:
                {
                    cout << "KONIEC";
                    break;
                }
                default:
                {
                    cout << "Cos poszlo nie tak.";
                    break;
                }
            }
        }
        else
        {
            cout << "KONIEC"
            << endl;
        }
        cout << endl;
        if( wybor1 != 0 ) cout << "Co teraz?" << endl << endl;
       
    } while( wybor1 != 0 );
   
}



EDIT: KOD JUŻ POPRAWIONY.
P-102107
Monika90
» 2014-01-13 20:31:09
Nie można zapisywać i odczytywać struktury zawierającej std::string za pomocą ostream::write i istream::read. Taki temat był już parę razy - poszukaj sobie.
P-102113
Yourin
Temat założony przez niniejszego użytkownika
» 2014-01-13 21:39:08
Dzięki za podpowiedź, usunąłem stringi, musiałbym wiedzieć czego szukać, żeby samodzielnie na to wpaść, program już działa dobrze, tylko nadal w funkcji dane są krzaczki i przypadkowe cyfry.

EDIT: Poprawiłem to, nie miałem wyczytywania po wyszukaniu rekordu, dodałem i działa.


Potrzebuję jeszcze pomysłu jak zrobić funkcję sortującą uczniów według nazwisk, żeby lista obecności wyświetlała się już posortowana oraz wyświetlanie listy zagrożonych poprzez podanie ocen i wyliczenie sredniej, a nastepnie zapisanie zagrozonych uczniow do osobnego pliku.
P-102123
« 1 »
  Strona 1 z 1