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

Problem z zapisem i odczytem z pliku binarnego

Ostatnio zmodyfikowano 2014-05-09 21:54
Autor Wiadomość
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
C/C++
#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 ];
    //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 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();
    }
   
    // wypisanie
   
    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
C/C++
#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.
P-109462
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 ) ) )
P-109474
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));
P-109477
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
P-109602
« 1 »
  Strona 1 z 1