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

Baza danych odczyt z pliku

Ostatnio zmodyfikowano 2009-08-25 22:02
Autor Wiadomość
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
C/C++
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

C/C++
bool WczytajTekstZpliku( fstream & plik, string & napis )
{
    short tDlugosc = 0;
    plik.read( reinterpret_cast < char *>( & tDlugosc ), sizeof( tDlugosc ) );
    if(( plik.gcount() == sizeof( tDlugosc ) ) ) //jeśli udało się pobrać długość tekstu
    {
        napis.resize( tDlugosc );
        plik.read( const_cast < char *>( napis.c_str() ), tDlugosc );
        if(( plik.gcount() != tDlugosc ) ) return( false ); //nie udało się wczytać kompletnych danych
       
    } else return( false ); //nie udało się wczytać kompletnych danych
   
    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 )
            )
            { //jeśli uda się wczytać 3 napisy dodajmy rekord do bazy
                tablica[ iloscElementow ] = tTymczasowaOsoba;
                iloscElementow++;
            } else break; //jeśli nie udało się wczytać napisów, przerwij dalsze wczytywanie napisów
           
        }
        plik.close();
    } else
    { //plik nie istnieje, utwórz plik
        plik.clear(); //wyczyszczenie flag - wymagane jeśli chcemy ponownie otwierać plik wykorzystując tą samą zmienną
        plik.open( nazwaPliku, ios::out | ios::binary );
        if( plik.good() ) plik.close(); //jeśli udało się utworzyć plik, zamknij go
       
    }
}
P-9721
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:
C/C++
short zmienna = 123;
short * pZmienna = & zmienna;
Skoro plik musi mieć wskaźnik na typ char to musisz wykonać rzutowanie:
C/C++
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ć.
P-9722
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
C/C++
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??
P-9742
DejaVu
» 2009-08-23 13:09:32
tDlugosc zawiera ilość bajtów danych, które mają zostać odczytane.
P-9744
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??
P-9756
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 :(
P-9766
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 ;]
P-9813
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ć.
P-9815
« 1 » 2 3
  Strona 1 z 3 Następna strona