tfilestream i zapis char

dział ogólny

tfilestream i zapis char

Nowy postprzez Frani0 » czwartek, 18 grudnia 2008, 03:13

próbuje zapisać klasę za pomocą tfilestream a że mi to nie bardzo idzie to pisze temat

rzecz jest następująca mam tablice tworzoną dynamicznie
    char **autor;
    char **tytul;
    char **album;
    char **info;
    char **nazwapliku;
    char **nazwa;
    int *priorytet;
    char **kategoria;
    char **podkategoria;
    int *fade;
    bool *zablokowane;
    int *id;
    int ile;

gdy próbuje zapisać same int i bool wszystko jest ok lecz przy zapisywaniu choćby jednego znaku char program się krzaczy

Kod: Zaznacz cały

class utwory
{
        private:
                struct zapis
                {
                        char autor[40];
                        char tytul[40];
                        char album[40];
                        char info[1000];
                        char nazwapliku[200];
                        char nazwa[100];
                        int priorytet;
                        char kategoria[20];
                        char podkategoria[20];
                        int fade;
                        bool zablokowane;
                        int id;
                        int ile;
                };
                zapis zapisuj;
        public:
                char **autor;
                char **tytul;
                char **album;
                char **info;
                char **nazwapliku;
                char **nazwa;
                int *priorytet;
                char **kategoria;
                char **podkategoria;
                int *fade;
                bool *zablokowane;
                int *id;
                int ile;

        utwory()
        {
                autor=new char *[100000];
                for(int i=0;i<100000;i++)
                        autor[i]=new char[40];

                tytul=new char *[100000];
                for(int i=0;i<100000;i++)
                        tytul[i]=new char[40];

                album=new char *[100000];
                for(int i=0;i<100000;i++)
                        album[i]=new char[40];

                info=new char *[100000];
                for(int i=0;i<100000;i++)
                        info[i]=new char[1000];

                nazwapliku=new char *[100000];
                for(int i=0;i<100000;i++)
                        nazwapliku[i]=new char[200];

                nazwa=new char *[100000];
                for(int i=0;i<100000;i++)
                        nazwa[i]=new char[100];

                kategoria=new char *[100000];
                for(int i=0;i<100000;i++)
                        kategoria[i]=new char[20];

                podkategoria=new char *[100000];
                for(int i=0;i<100000;i++)
                        podkategoria[i]=new char[20];

                priorytet = new int[100000];
                fade = new int[100000];
                zablokowane = new bool[100000];
                id = new int[100000];
                ile=0;
        };
        ~utwory()
        {
                for(int i=0;i<100000;i++)
                        delete [] autor[i];
                delete [] autor;

                for(int i=0;i<100000;i++)
                        delete [] tytul[i];
                delete [] tytul;

                for(int i=0;i<100000;i++)
                        delete [] album[i];
                delete [] album;

                for(int i=0;i<100000;i++)
                        delete [] info[i];
                delete [] info;

                for(int i=0;i<100000;i++)
                        delete [] nazwa[i];
                delete [] nazwa;

                for(int i=0;i<100000;i++)
                        delete [] nazwapliku[i];
                delete [] nazwapliku;

                for(int i=0;i<100000;i++)
                        delete [] kategoria[i];
                delete [] kategoria;

                for(int i=0;i<100000;i++)
                        delete [] podkategoria[i];
                delete [] podkategoria;



                delete [] priorytet;
                delete [] fade;
                delete [] zablokowane;
                delete [] id;
                ile=0;
        };

        void dodaj(String autor,String tytul,String album,String info,String nazwapliku,String nazwa,int priorytet,String kategoria,String podkategoria,int fade,bool zablokowane)
        {
                strcpy(this->autor[ile],autor.c_str());
                strcpy(this->tytul[ile],tytul.c_str());
                strcpy(this->album[ile],album.c_str());
                strcpy(this->info[ile],info.c_str());
                strcpy(this->nazwapliku[ile],nazwapliku.c_str());
                strcpy(this->nazwa[ile],nazwa.c_str());
                strcpy(this->kategoria[ile],kategoria.c_str());
                strcpy(this->podkategoria[ile],podkategoria.c_str());
                this->priorytet[ile]=priorytet;
                this->fade[ile]=fade;
                this->zablokowane[ile]=zablokowane;
                if(ile!=0)
                        id[ile]=id[ile-1]+1;
                else
                        id[ile]=0;
                ile++;
        }

        void usun(int ktore)
        {
                for(int i=ktore;i<ile;i++)
                {
                        strcpy(this->autor[i],this->autor[i+1]);
                        strcpy(this->tytul[i],this->tytul[i+1]);
                        strcpy(this->album[i],this->album[i+1]);
                        strcpy(this->info[i],this->info[i+1]);
                        strcpy(this->nazwapliku[i],this->nazwapliku[i+1]);
                        strcpy(this->nazwa[i],this->nazwa[i+1]);
                        this->kategoria[i]=this->kategoria[i+1];
                        this->podkategoria[i]=this->podkategoria[i+1];
                        this->priorytet[i]=this->priorytet[i+1];
                        this->fade[i]=this->fade[i+1];
                        this->zablokowane[i]=this->zablokowane[i+1];
                        this->id[i]=this->id[i+1];
                }
                ile--;
        }
        void zapisz()
        {
                TFileStream *pfs;
                AnsiString asexe=Application->ExeName;
                AnsiString aspas=ExtractFilePath(asexe);
                AnsiString as=aspas+"test.bin";

                pfs=new TFileStream(as,fmCreate);
                for(int i=0;i<ile;i++)
                {
                        pfs->Write(&autor[i],40);

                        pfs->Write(&priorytet[i],sizeof(int));
                        pfs->Write(&fade[i],sizeof(int));
                        pfs->Write(&id[i],sizeof(int));
                        pfs->Write(&zablokowane[i],sizeof(bool));
                }
                pfs->Write(&ile,sizeof(int));
                pfs->Free();
        }
        void wczytaj()
        {
                TFileStream *pfs;
                AnsiString asexe=Application->ExeName;
                AnsiString aspas=ExtractFilePath(asexe);
                AnsiString as=aspas+"test.bin";

                if(FileExists(as))
                        pfs=new TFileStream(as,fmOpenRead);
                else
                        pfs=new TFileStream(as,fmCreate);

                pfs->Read(&ile,sizeof(int));
                for(int i=0;i<ile;i++)
                {
                        pfs->Read(&zablokowane[i],sizeof(bool));
                        pfs->Read(&id[i],sizeof(int));
                        pfs->Read(&fade[i],sizeof(int));
                        pfs->Read(&priorytet[i],sizeof(int));
                        pfs->Read(&autor[i],40);
                }
                pfs->Free();
        }
};


co robię nie tak :(
Avatar użytkownika
Frani0
Bladawiec
Bladawiec
 
Posty: 48
Dołączył(a): poniedziałek, 25 sierpnia 2008, 18:23
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: tfilestream i zapis char

Nowy postprzez Witold » czwartek, 18 grudnia 2008, 12:27

Wydaję mi się że chodzi o to:

Kod: Zaznacz cały
pfs->Write(autor[i],40);  //zamiast pfs->Write(&autor[i],40);


mógłbyś zmienić jeszcze:
Kod: Zaznacz cały
delete pfs; // zamiast  pfs->Free();


oraz użyć vector’a wraz z tą strukturą którą zadeklarowałeś (struct zapis) zamiast tablic.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: tfilestream i zapis char

Nowy postprzez Frani0 » piątek, 19 grudnia 2008, 01:26

dziękuje to pierwsze pomogło ;) teraz nawet wiem czemu działa ;P

bo w TFileStream są 2 Write jeden przyjmuje void drugi przyjmuje char i np jeśli chcemy int to idziemy przez wskaźnik czyli &int tak samo chciałem z char ale w przypadku char trzeba przez ten drugi czyli zapis char

teraz będę próbował zapisać tablice ale coś czuje że trzeba będzie każdy element oddzielnie ;)

dziękuje za pomoc
Avatar użytkownika
Frani0
Bladawiec
Bladawiec
 
Posty: 48
Dołączył(a): poniedziałek, 25 sierpnia 2008, 18:23
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: tfilestream i zapis char

Nowy postprzez polymorphism » piątek, 19 grudnia 2008, 15:53

No no, niezły radykał z ciebie ;) Na dzień dobry klasa utwory zajmuje ~147MB. Chyba przesadziłeś trochę, nie sądzisz?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: tfilestream i zapis char

Nowy postprzez Frani0 » poniedziałek, 22 grudnia 2008, 23:37

trochę ;P jak patrze na id3-tag wersji 1 to widzę że sporo przesadziłem ;) teraz mam inny problem ale to chyba założę nowy temat żeby nie zaśmiecać forum ;)
Avatar użytkownika
Frani0
Bladawiec
Bladawiec
 
Posty: 48
Dołączył(a): poniedziałek, 25 sierpnia 2008, 18:23
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości