Haker123 Temat założony przez niniejszego użytkownika |
Baza danych odczyt z pliku » 2009-08-22 14:37:01 Witam. Dalej mam maly problem z odszyfrowaniem tego odczytu bo nie rozumiem linijki plik.read( reinterpret_cast < char *>( & tDlugosc ), sizeof( tDlugosc ) );
dlaczego do chara zapisuje adres tdlugosc ktora jest liczba short, i do niej wogle nic nie zapisuje zadnych danych zeby z niej mogl czytac program, wiec skad program wie co ma czytac. wiem ze to glupie pytania ale jakos nie rozumiem tego a chce dokonczyc program puki mam wolne. ponizej zamieszczam cala funkcje bool WczytajTekstZpliku( fstream & plik, string & napis ) { short tDlugosc = 0; plik.read( reinterpret_cast < char *>( & tDlugosc ), sizeof( tDlugosc ) ); if(( plik.gcount() == sizeof( tDlugosc ) ) ) { napis.resize( tDlugosc ); plik.read( const_cast < char *>( napis.c_str() ), tDlugosc ); if(( plik.gcount() != tDlugosc ) ) return( false ); } else return( false ); return( true ); } void WczytajDaneZPliku( const char * nazwaPliku, OsobaST tablica[], int & iloscElementow ) { fstream plik; plik.open( nazwaPliku, ios::in | ios::binary ); if( plik.good() ) { iloscElementow = 0; while( !plik.eof() ) { OsobaST tTymczasowaOsoba; short tDlugosc; if( ( WczytajTekstZpliku( plik, tTymczasowaOsoba.imie ) == true ) && ( WczytajTekstZpliku( plik, tTymczasowaOsoba.nazwisko ) == true ) && ( WczytajTekstZpliku( plik, tTymczasowaOsoba.telefon ) == true ) ) { tablica[ iloscElementow ] = tTymczasowaOsoba; iloscElementow++; } else break; } plik.close(); } else { plik.clear(); plik.open( nazwaPliku, ios::out | ios::binary ); if( plik.good() ) plik.close(); } }
|
|
DejaVu |
» 2009-08-22 15:15:21 Jeśli zapisujesz dane binarnie, musisz je również odczytać binarnie. Najmniejszą jednostką dostępu do danych (operacje dyskowe) jest 1 bajt, czyli jeden znak (char). Zmienna short zajmuje 2 bajty, więc sizeof(short)=2. Wszystkie operacje związane z plikami operują na bajtach tak więc zmienną, która jest typu short musisz rzutować na bajty. Aby dostać adres od którego zaczyna się zmienna w pamięci piszesz &zmienna;. Czyli: short zmienna = 123; short * pZmienna = & zmienna; Skoro plik musi mieć wskaźnik na typ char to musisz wykonać rzutowanie: char * pDane = reinterpret_cast < char *>( pZmienna );
Adres pamięci dla zmiennej pZmienna jak i pDane jest jednakowy. Używając zmiennej pZmienna odczytasz jednak 2 bajty z pamięci, natomiast pDane tylko 1 bajt. Resztę myślę, że możesz już sam wywnioskować. |
|
Haker123 Temat założony przez niniejszego użytkownika |
» 2009-08-23 12:41:51 Czyli jak dobrze rozumiem to przy plikach binarnych nie musze pisac ile ma wczytac bo program sam wczytuje tyle ile potrzebuje?? A tak sie jeszcze zapytam czy dobrze rozumiem plik.read( const_cast < char *>( napis.c_str() ), tDlugosc );
w tej linijce przypisuje do char adres napisu i z tego napisu czyta cala zawartosc pliku?? |
|
DejaVu |
» 2009-08-23 13:09:32 tDlugosc zawiera ilość bajtów danych, które mają zostać odczytane. |
|
Haker123 Temat założony przez niniejszego użytkownika |
» 2009-08-23 15:26:41 Czyli jeden napis z pliku to 2 bajty?? obojetne jak dlugi jest?? |
|
Haker123 Temat założony przez niniejszego użytkownika |
» 2009-08-23 17:38:47 Kurde dalej tego nie rozumiem :( nie wiem czy to takie trudne czy ja jestem na to zaglupi :P Sprubuje jutro nad tym posiedziec moze jutro to zrozumiem :( |
|
Haker123 Temat założony przez niniejszego użytkownika |
» 2009-08-24 20:44:45 Dalej tego nie rozumiem ;/ mam prosbe czy moglby ktos napisac funkcje wczytywanie z pliku binarnego i wyjasnij go liijka po linijce?? bo chce to zrozumiec ale mi to nie wychodzi i mam nadzieje ze to zrozumiem jak ktos by napisal ta funkcje. Bede bardzo wdzieczny ;] |
|
WunM |
» 2009-08-24 21:09:55 Jeśli na twoim komputerze zmienna int ma 4bajty to można to zapisać w tablicy char:
| 1bajt | 2bajt | 3bajt | 4bajt |
Operując na plikach binarnych posługujemy się typem char który ma zawsze 1bajt (darujmy sobie wyjaśnianie dlaczego właśnie char). Funkcja którą odczytujesz/zapisujesz dane z/do pliku binarnego też posługuje się typem char (co za przypadek - ja Władek ty Władek). Skoro ma odczytać jakąś zmienną (niech będzie ten int) to musi wiedzieć na ile bajtów ma do odczytania. Najlepiej przekazać to jej za pomocą sizeof( typ ). W końcu otrzymaną przez funkcję tablicę musimy "przekształcić" na zmienną danego typu (rzutowanie). Czyli krócej:
- Podajemy funkcji ile bajtów nam do szczęścia potrzeba (rozmiar odczytywanej zmiennej) - Ona zapisuje nam do podanej przez nas wcześniej tablicy char wszystkie potrzebne bajty... - ... które następnie trzeba zapisać do zmiennej rzutowaniem
Podobnie jest z zapisem tyle że odwrotnie.
A wszystko dlatego że funkcja preferuje wyłącznie typ char. Są oczywiście takie sprytne funkcje w stylu read32 (gdzie liczba to ilość bitów lub bajtów). Ale zawsze można samemu taką napisać. |
|
« 1 » 2 3 |