[C++] Wczytywanie 2 bajtów z pliku

Witam,

mam plik, w którym są zapisane 3 bajty. Pierwszy bajt jest nieważny i mogę go wyrzucić, ale następne chciałbym pobrać do inta (to jest liczba). Dlaczego więc taki kod nie działa :?:

int ile = 0;//...

nie wiem jak to jest w c++ ale szanujacy sie jezyk powinien miec takie metody

  1. wczytaj calosc

  2. konwersja na string

  3. operacja na stringu, wycinasz pierwszy znak

  4. konwersja na int

Mógłbyś podać minimalny kompilowalny kod, plik z którego wczytujesz oraz opisać jak objawia się to niedziałanie?

@pain3hp: tak wczytywanie binarne nie działa. Mając offsety i konkretne bity nie ma sensu zrzucać tego do stringa, tym bardziej, że może tam wystąpić 0, które może być uznane za koniec stringa.

Użyj typu short i biblioteki cstdio (jakoś zawsze wolałem mieć wszystko pod kontrolą, a rzutowania z c++ nigdy nie lubiłem):

void save(short a){

  FILE *f=fopen("test.dat", "wb");

  fputc((char)121, f);

  fwrite((char*)&a, 2, 1, f);

  fclose(f);

}

short load(){

  FILE *f=fopen("test.dat", "rb");

  short a=0;

  fgetc(f);

  fread((char*)&a, 2, 1, f);

  fclose(f);

  return a;

}

BTW. współczesne systemy są little-endianowe. Najmniej znaczący bajt jest na pierwszym miejscu, czyli liczba decymalna 1 to HEX na 2 bajtach to nie 00 01, tylko 01 00. Jeżeliten plik binarny tworzysz w jakimś programie, uwzględnij to, że te bajty są na odwrót. Ma to też swoje zalety: w teorii da się łatwo shorta do inta zrzucić.

Użycie typu “int” jest dość niebezpieczne ostatnimi czasy: przyjęło się że ma 4 bajty, a tu nagle na 64-bitowym systemie zonk: 8 bajtów i serializacja pliku z 32-bitowego systemu się sypie. bezpieczniej użyć bezpośrednio typu long.