2013-09-05 7 views
5

Mam plik binarny, a.bin, który zawiera 768 bajtów.Odczytaj kilka bajtów, przeskocz ponad N bajtów, a następnie ponownie odczytaj kilka bajtów. w jaki sposób?

I chcę umieścić bajtów 16-256, 272-512, 528-768 do

char data[720] 

zrobiłem coś jak

ifstream a1; 
a1.open("a.bin", ios::in|ios::binary) 

char tmp[256] 
a1.read(tmp,256) 

a potem zrobił kilka pętli i skopiować do tmp dane [720] w logice. Ale to wygląda naprawdę głupio. Więc chcę zapytać:

  1. Jak mogę odczytać dane do określonego położenia znaku?

    a1.read (tmp [2], 2) // niedozwolone, jak to osiągnąć?

  2. Jak mogę przeskoczyć w określonym dniu?

    a1.read (tmp16,16); Mogę użyć tego, aby przeskoczyć 16 bajtów i użyć neve tmp16, ale wygląda to brzydko.

+0

spojrzeć [seekg] (http://en.cppreference.com/w/cpp/io/basic_istream/seekg) –

Odpowiedz

3

Wierzę, że droga do pracy to ignore.

Jedziesz.

a1.ignore(16);     // [1] 
a1.read(data, 256-16);   // [2] 
a1.ignore(272-256);    // [3] 
a1.read(&data[256-16], 512-272); // [4] 
// and so on 
  1. ignorować 1st 16 bajtów
  2. można przejść z data tutaj, bo to jest adres 1 byt bufora, w zasadzie takie same jak & danych [0]
  3. pomiń następny niechciane bajty:
  4. to zajmie i przejdzie adres data[256-16+1] jako bufor do odczytu. Zwykły data[17] po prostu zabrałby wartość z tego miejsca, podczas gdy operator & przyjmuje swój adres. Umieściłem tam 256-16, ponieważ jest to liczba bajtów odczytanych w poprzednim wywołaniu i chcemy rozpocząć czytanie na następnej wolnej przestrzeni. Numeracja od 0 to jest to.
0

Aby dowiedzieć się do pewnego punktu w tablicy trzeba podaj adres

a1.read(tmp+2, 2) 

Albo można zrobić

a1.read(&tmp[2], 2) // the & operator is the address of operator 
5

Na pierwsze pytanie:

a1.read(&tmp[2], 2); 

czyta dwa bajty w tmp[2] i tmp[3].

Na drugie pytanie:

a1.ignore(10); 

pomija 10 bajtów.

Powiązane problemy