marcin022 Temat założony przez niniejszego użytkownika |
Problem z zapisem i odczytem z pliku binarnego » 2014-05-07 22:46:56 Witam mam do napisania pewien program w ramach szkolnego ćwiczenia. Do tej pory robilem wszystko tak jak nas uczyli na wykładach jednak kiedy chce wyswietlic zawartość pliku bo wczytaniu go do tablicy w consoli pojawiają się krzaki. Proszę o pomoc #include<iostream> #include<string> #include<fstream> #include "film.h" #include<conio.h>
using namespace std;
int main() { int id_filmu; int id_aktora; char tytul[ 20 ]; char nazwisko[ 20 ]; char data_produkcji[ 20 ]; Obsada oi[ 100 ], oo[ 100 ]; Film fi[ 100 ], fo[ 100 ]; Aktor ai[ 100 ], ao[ 100 ]; int liczba_filmow = 0; int liczba_aktorow = 0; char * plik_film = "plik_film.dat"; char * plik_obsada = "plik_obsada.dat"; char * plik_aktor = "plik_aktor.dat"; for(;; ) { cout << endl << "Podaj id_filmu, tytul i date produkcji: "; cin >> id_filmu >> tytul >> data_produkcji; Film tmp( id_filmu, tytul, data_produkcji ); fi[ liczba_filmow ] = tmp; liczba_filmow++; for(;; ) { cout << "Podaj id aktora i jego nazwisko "; cin >> id_aktora >> nazwisko; Aktor tmp( id_aktora, nazwisko ); Obsada tmp_o( id_aktora, id_filmu ); ai[ liczba_aktorow ] = tmp; oi[ liczba_aktorow ] = tmp_o; liczba_aktorow++; cout << endl << "Aby zakonczyc dodawanie aktorow nacisnij T" << endl; if( getch() == 't' ) { break; } } cout << endl << "Aby zakonczyc dodawanie filmow nacisnij T" << endl; if( getch() == 't' ) { break; } } ofstream do_film( plik_film, ios_base::app | ios_base::binary ); if( do_film.is_open() ) { for( int i = 0; i < liczba_filmow; i++ ) do_film.write(( char * )( fo ), sizeof( Film ) ); do_film.close(); } ifstream z_film( plik_film, ios_base::binary ); if( z_film.is_open() ) { liczba_filmow = 0; while( z_film.read(( char * )( fi ), sizeof( Film ) ) ) { liczba_filmow++; } z_film.close(); } for( int i = 0; i < liczba_filmow; i++ ) { cout << fi[ i ].daj_id_filmu() << " " << fi[ i ].pokaz_date() << " " << fi[ i ].pokaz_tytul(); } system( "pause" ); return 0; } no i zawartość pliku z classami #include<iostream> #include<string>
using namespace std;
class Aktor { int id_aktora; char nazwisko[ 20 ]; public: Aktor() { } Aktor( int id_aktora, char * nazwisko ) { strcpy( this->nazwisko, nazwisko ); this->id_aktora = id_aktora; } int daj_id() { return id_aktora; } char * daj_nazwisko() { return nazwisko; } void pokaz_dane() { cout << endl << id_aktora << " " << nazwisko; } };
class Obsada { int id_aktora; int id_filmu; public: Obsada() { } Obsada( int id_aktora, int id_filmu ) { this->id_aktora = id_aktora; this->id_filmu = id_filmu; } int daj_id_aktora() { return id_aktora; } int daj_id_filmu() { return id_filmu; } };
class Film { int id_filmu; char tytul[ 20 ]; char data_produkcji[ 20 ]; public: Film() { } Film( int id_filmu, char * tytul, char * data_produkcji ) { strcpy( this->data_produkcji, data_produkcji ); strcpy( this->tytul, tytul ); this->id_filmu = id_filmu; } int daj_id_filmu() { return id_filmu; } char * pokaz_date() { return data_produkcji; } char * pokaz_tytul() { return tytul; } }; Wiem ze estetycznie nie wygląda on najlepiej i powinienem go rozbic na funkcje zamiast wszystko poza klasami i ich metodami walic w main ale jest to wczesny build tego programu. |
|
alixir |
» 2014-05-08 08:16:25 Ogólnie 2 błędy: 1. Z konsoli wczytujesz dane o filmach do tablicy 'fi', a do pliku zapisujesz tablicę 'fo'. Popraw tą linijkę (zmień fi na fo) fi[ liczba_filmow ] = tmp; 2. Wczytywanie danych z pliku powinno wyglądać tak while( z_film.read(( char * )( & fi[ liczba_filmow ] ), sizeof( Film ) ) ) |
|
marcin022 Temat założony przez niniejszego użytkownika |
» 2014-05-08 09:13:03 Co do 1. to mój blad, nie widziałem go wcześniej. Dziekuje Serdecznie. A z taka metoda zapisu spotykam się pierwszy raz ale rzeczywiście to ma sens.Jak będę w domu to sprawdze czy dziala. Update Dziekuje serdecznie program działa jak należy. Poprawilem jeszcze sam zapis anologicznie do odczytu. do_film.write((char*)(&fo[i]), sizeof(Film)); |
|
marcin022 Temat założony przez niniejszego użytkownika |
» 2014-05-09 21:54:44 Przepraszam jeżeli blad o który pytam jest glupi bo przypuszczam ze może być wręcz durny a ja go nie widze. Dopisalem pare linijek kodu. Wszystko ladnie pięknie się kompiluje plik_film zapisuje dane do pliku ale w przypadku plik_autor i plik_obsada tak już się nie dzieje chociaż postepowalem analogicznie do zapisu plik_film. W definicji classy nic się nie zmienilo a to kod który ulegl zmianie #include<iostream> #include<string> #include<fstream> #include "film.h" #include<conio.h>
using namespace std;
int main() { //classa obsada bedzie lacznikiem pomiedzy filmem a aktorem skoro nie mozna tego zrobic z dziedziczeniem na tym etapie int id_filmu=0; int id_aktora; char tytul[20]; char nazwisko[20]; char data_produkcji[20]; //tablice pomocniczne Obsada oi[100], oo[100]; Film fi[100], fo[100]; Aktor ai[100], ao[100]; int liczba_filmow=0; int liczba_aktorow=0; //wskazniki do nazwplikow char* plik_film="plik_film.dat"; char* plik_obsada="plik_obsada.dat"; char* plik_aktor="plik_aktor.dat"; //wypelnianie tablic wartosciami for( ; ; )//dla filmow { cout<<endl<<"Podaj tytul i date produkcji: "; id_filmu++; cin>>tytul>>data_produkcji; Film tmp(id_filmu, tytul, data_produkcji); fo[liczba_filmow]=tmp; liczba_filmow++; for( ; ; ) { cout<<"Podaj nazwisko aktora "; cin>>nazwisko; for(int i=0;i<liczba_aktorow;i++) { if(nazwisko==ai[i].daj_nazwisko()) id_aktora=ai[i].daj_id(); else id_aktora++;
} Aktor tmp(id_aktora, nazwisko); Obsada tmp_o(id_aktora, id_filmu); ao[liczba_aktorow]=tmp; oo[liczba_aktorow]=tmp_o; liczba_aktorow++; cout<<endl<<"Aby zakonczyc dodawanie aktorow nacisnij T"<<endl; if(getch()=='t'){break;} } cout<<endl<<"Aby zakonczyc dodawanie filmow nacisnij T"<<endl; if(getch()=='t'){break;}
} ofstream do_film(plik_film, ios_base::app | ios_base::binary); if(do_film.is_open()){ for(int i=0;i<liczba_filmow;i++) do_film.write((char*)(&fo[i]), sizeof(Film)); do_film.close(); }
ifstream z_film(plik_film, ios_base::binary); if(z_film.is_open()) { liczba_filmow=0; while(z_film.read((char*)(&fi[liczba_filmow]), sizeof(Film))) { liczba_filmow++; } z_film.close(); }
//zapis obsady do pliku ofstream do_obsada(plik_obsada, ios_base::app| ios_base::binary ); if(do_obsada.is_open()){ for(int i=0; i<liczba_aktorow; i++) { do_film.write((char*)(&oo[i]), sizeof(Obsada)); } do_film.close(); } //odczyt obsady z pliku ifstream z_obsada(plik_obsada, ios_base::binary); if(z_obsada.is_open()){ liczba_aktorow=0; while(z_obsada.read((char*)(&oi[liczba_aktorow]), sizeof(Obsada))) { liczba_aktorow++; } z_obsada.close(); } //zapis aktorow do pliku ofstream do_aktor(plik_aktor, ios_base::app | ios_base::binary ); if(do_aktor.is_open()){ for(int i=0;i<liczba_aktorow;i++) do_aktor.write((char*)(&ao[i]), sizeof(Aktor)); do_aktor.close(); } //odczyt aktor z pliku ifstream z_aktor(plik_aktor, ios_base::binary); if(z_aktor.is_open()){ liczba_aktorow=0; while(z_aktor.read((char*)(&ai[liczba_aktorow]), sizeof(Aktor))) liczba_aktorow++; z_aktor.close(); }
// wypisanie
for(int i=0;i<liczba_filmow;i++) { cout<<fi[i].daj_id_filmu()<<" "<<fi[i].pokaz_date()<<" "<<fi[i].pokaz_tytul()<<endl; }
system("pause"); return 0;
}
znalazłem blad w zapisie plik obsada. do zlego pliku wpisywałem dane :) natomiast co do plik_autor nadal poszukuje rozwiazania znalazłem blad z plik_obsada. Zapisuje się :) powinno być do_obsada.write ja dalem do_film.write to chyba zmeczenie. Natomiast pojawil się kolejny problem musze wymyśleć jak rozwiązać problem niepowtarzalnego ID. Moglbym zapisac wartość ostatniego zapisanego id do pliku potem wczytać id z pliku i zrobić iteracje np. ? Czy możecie zaproponować jakies inne rozwiązanie. Chodzi o to aby każdy nowy film miał id większe o 1 |
|
« 1 » |