Pliki w trybie binarnym, projekt w C++
Ostatnio zmodyfikowano 2014-01-13 21:39
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. #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. |
|
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. |
|
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. |
|
« 1 » |