Nowe posty

xx Dystrybucja pod HP Omen (6)
2024-03-27, 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
lamp Problem z Linux Lite po instalacji (0)
2024-03-27, 19:50:30
xx Ile pingwinów? (1)
2024-03-27, 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: qt i binarny zapis/odczyt  (Przeczytany 17429 razy)

mody

  • Gość
qt i binarny zapis/odczyt
« dnia: 2005-08-03, 10:42:46 »
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

  • Gość
qt i binarny zapis/odczyt
« Odpowiedź #1 dnia: 2005-08-02, 21:30:33 »
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

  • Gość
qt i binarny zapis/odczyt
« Odpowiedź #2 dnia: 2005-08-02, 22:25:41 »
ja zawsze blad znajde jak posta umieszcze dopiero :]

sizeof((*data))

amdfanatyk

  • Gość
qt i binarny zapis/odczyt
« Odpowiedź #3 dnia: 2005-08-03, 12:24:51 »
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

  • Gość
qt i binarny zapis/odczyt
« Odpowiedź #4 dnia: 2005-08-03, 12:37:19 »
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.

amdfanatyk

  • Gość
qt i binarny zapis/odczyt
« Odpowiedź #5 dnia: 2005-08-03, 12:48:05 »
te funkcje nie sa metodami klasy; tworze egzemplarz klasy a potem albo zrzucam go do pliku albo wczytuje ale tak ogolnie to metody klasy nie sa zrzucane do pliku :]

xis

  • Gość
qt i binarny zapis/odczyt
« Odpowiedź #6 dnia: 2005-08-03, 13:11:06 »
Dopiero teraz to zobaczyłem:

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

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

Używasz tu sizeof(data), ale czy masz już stworzony za pomocą konstruktora egzemplarz tej klasy?

Być może możesz użyć tylko sizeof( CKlasa );

O ile pamiętam 'sizeof()' może przyjąć za argument nie tylko obiekt, ale też nazwę typu obiektu, w ten sposób oszacuje sobie jego wielkość. Nie pamiętam już, ale sizeof() byc może zwraca wartośc ujemną gdy dostaje NULL.
Strzelam, bo kompletnie nie pamiętam. Mogłeś zapisać wszystko w XML i byś miał kłopot z głowy :)
Ech, zapomniałem już te wszystkie tricki ze wskaźnikami.

amdfanatyk

  • Gość
qt i binarny zapis/odczyt
« Odpowiedź #7 dnia: 2005-08-03, 13:45:45 »
robilem teraz z fstream i read oraz write i efekt jest taki sam :(

wnioski:
a) dane binarnie zapisane do pliku moze czytac tylko proces, ktory je utworzyl?? cos z kernelem??
b) wina gcc 4
c) nie zanosi sie na to, zebym sobie z tym poradzil :(

wojtekm

  • Gość
qt i binarny zapis/odczyt
« Odpowiedź #8 dnia: 2005-08-03, 14:24:01 »
Twój problem prawdopodobnie polega na tym, że nowa instancja progrmu, która wczytuje dane wykonuje się w _zupełnie innym kontekście_, tzn. że pola metod klasy wczytanej z pliku mają wskaźniki wzięte z kosmosu (a dokładnie z nieistniejącego już procesu), które nie mają nic wspólnego z aktualnie wykonywanym procesem.
IMHO taki trick może wyjść tylko na zwykłych strukturach, ktróre nie przechowuja wskaźników.
Taka zabawa jest możliwa np. w pythonie, gdzie metody klasy są rozpoznawane dynamicznie po nazwie, ale nie w C++ gdzie wszytsko jest "zafixowane" wskaźnikami.

Wojtek

amdfanatyk

  • Gość
qt i binarny zapis/odczyt
« Odpowiedź #9 dnia: 2005-08-03, 14:35:07 »
prawdopodobnie masz racje ale dlaczego zatem spokojnie zrzucalem egzemplarze klasy korzystajac z MFC na windzie i wszystko dzialalo??

amdfanatyk

  • Gość
qt i binarny zapis/odczyt
« Odpowiedź #10 dnia: 2005-08-03, 14:36:42 »
za Twoja wersja przemawia takze to, ze jak sprawdzalem edytorem binarnym zawartosc pliku to po kazdym zapisie byla inna :(

wojtekm

  • Gość
qt i binarny zapis/odczyt
« Odpowiedź #11 dnia: 2005-08-03, 15:12:34 »
2005-08-03 14:35:07 amdfanatyk napisał:

> prawdopodobnie masz racje ale dlaczego zatem spokojnie zrzucalem egzemplarze klasy korzystajac z
 > MFC na windzie i wszystko dzialalo??

Nie pogramowałem nigdy w MFC, być może tam kod metod pojawiał się zawsze w tym samym miejscu. Spróbuj użyć flagi kompilacji '-fPIC', ale podejrzewam, że to niczego nie zmieni.

Wojtek

amdfanatyk

  • Gość
qt i binarny zapis/odczyt
« Odpowiedź #12 dnia: 2005-08-03, 15:35:26 »
ech nie zmienilo, mysle ze to kwesia kompilatora poniewaz wtedy i tak nie korzystalem z serializacji MFC tylko z fstream (write i read), tutaj probowalem tego samego ale bez skutku :( ciekawe jest to, ze Jesse Liberty w swojej ksiazce tak samo zrzuca egzemplarze obiektow klas :] ale to widac MS'owe kompilatory sa tylko takie zdolne; troche glupio bo bede musial zrobic zapis tekstowy a to: mniej optymalne, mniej bezpieczne, niewygodne :(