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;//...
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
wczytaj calosc
konwersja na string
operacja na stringu, wycinasz pierwszy znak
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.