Programowanie > C/C++ - KDE/Qt

qt i binarny zapis/odczyt

(1/3) > >>

mody:
SuSe 9.3. Evaluating
1. Kaffeine, jukebox nie chcą odtwarzać plików z dysków windowsa (ntfs). Pojawia się komunikat że mozna odtwarzać tylko z dysków lokalnych.
Mam też MPlayera i XMMSa i one nie mają już takich problemów.
2. Skojarzyłem sobie pliki filmowe z MPlayerem. Gdy klikam na plik na dysku Windy otwiera się MPlayer i powinien odtwarzać film. Niestety on rzuca komunikat że nie może znaleźć pliku w katalogu domowym... dopiero gdy skorzystam z open.. wtedy działa jak trzeba..

Czy ktoś mógłby mi poradzić gdzie są jakieś możliwości ustawień??

amdfanatyk:
szlag mnie trafia bo mecze sie juz dlugo zeby zrzucic egzemplarz obiektu klasy do pliku i plik jest tworzony ale jak go wyedytuje to sa same zera i z reszta program takze zachowuje sie tak, jakby danych tam nie bylo :[

oto fragment kodu:

QFile * fout = new QFile(dir.path() + "/data");

fout->open(IO_WriteOnly);
fout->writeBlock((char *)data, sizeof(data));
fout->close();
      
delete fout;

QFile * fin = new QFile(dir.path() + "/data");

fin->open(IO_ReadOnly);
fin->readBlock((char *)data, sizeof(data));
fin->close();

delete fin

i co ja tu zle robie??

amdfanatyk:
ja zawsze blad znajde jak posta umieszcze dopiero :]

sizeof((*data))

amdfanatyk:
jednak jest problem :(

//mam jakas tam klase np
CKlasa * data = new CKlasa;
// ma ona zmienne w sekcji prywatnej i akcesory w publicznej

// i funkcje do zapisu
QFile * fout = new QFile(dir.path() + "/data");

fout->open(IO_WriteOnly);
fout->writeBlock((char *)data, sizeof(*data));
fout->close();

delete fout;

-----------------------------------------------

CKlasa * data = new CKlasa;

// i odczytu danych

QFile * fin = new QFile(dir.path() + "/data");

fin->open(IO_ReadOnly);
fin->readBlock((char *)data, sizeof(*data));
fin->close();

delete fin

gdy w programie najpierw zapisze dane do pliku pierwsza funkcja i odczytam druga to jest ok ale gdy zamkne program i przerobie kod tak, ze funkcja zapisujaca jest wykomentowana i uruchamia sie tylko ta, ktora czyta dane, to dostaje komunikaty typu:

QGArray: Cannot allocate array with negative length
Naruszenie ochrony pamięci

terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc
Przerwane

i generealnie naruszenie ochrony pamieci :[ nie rozumiem w czym tu jest problem :((((

xis:
2005-08-03 12:24:51 amdfanatyk napisał:

> jednak jest problem :(
 >
 > //mam jakas tam klase np
 > CKlasa * data = new CKlasa;
 > // ma ona zmienne w sekcji prywatnej i akcesory w publicznej
 >
 > // i funkcje do zapisu
 > QFile * fout = new QFile(dir.path() + "/data");
 >
 > fout->open(IO_WriteOnly);
 > fout->writeBlock((char *)data, sizeof(*data));
 > fout->close();
 >
 > delete fout;
 >
 > -----------------------------------------------
 >
 > CKlasa * data = new CKlasa;
 >
 > // i odczytu danych
 >
 > QFile * fin = new QFile(dir.path() + "/data");
 >
 > fin->open(IO_ReadOnly);
 > fin->readBlock((char *)data, sizeof(*data));
 > fin->close();
 >
 > delete fin
 >
 > gdy w programie najpierw zapisze dane do pliku pierwsza funkcja i odczytam druga to jest ok ale
 > gdy zamkne program i przerobie kod tak, ze funkcja zapisujaca jest wykomentowana i uruchamia sie
 > tylko ta, ktora czyta dane, to dostaje komunikaty typu:
 >
 > QGArray: Cannot allocate array with negative length
 > Naruszenie ochrony pamięci
 >
 > terminate called after throwing an instance of 'std::bad_alloc'
 >   what():  St9bad_alloc
 > Przerwane
 >
 > i generealnie naruszenie ochrony pamieci :[ nie rozumiem w czym tu jest problem :((((

Nigdy nie bawiłem się w zapis binarny do pliku w C++. Wydaje mi się jednak, że skoro używasz sizeof( *data );, a wielkość klasy uległa zmianie (wykasowałeś jedną metodę), to może odczyt jest nieudany, bo w pliku nie natrafiamy na egzemplarz IDENTYCZNEJ klasy, tylko takiej, która jest mniejsza o jedną metodę.

To jest właśnie wada zapisu obiektów binarnie, każda zmiana (wystarczy zmienić typ dowolnej składowej, najwyraźniej metody też są na to podatne), a od razu dyskwalifikuje odczyt z pliku.
Ale - jak już mowiłem - nie testowałem zapisu binarnego w C++, a jedynie w C i nie mam pewności czy w ogóle zapis adresów metod występuje w pliku binarnym.

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej