• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

String i jego reprezentacja w pliku binarnym

Object Storage Arubacloud
0 głosów
178 wizyt
pytanie zadane 6 listopada 2020 w C i C++ przez HydeFromT70s Nowicjusz (170 p.)
edycja 6 listopada 2020 przez HydeFromT70s

Witam.

Otóż zgłębiam wiedzę na temat edycji plików binarnych i ciekawi mnie poniższy przypadek.

 

Napisałem przykładowy kod, który zapisuje string "Sample" do pliku w postaci binarnej:

void saveToFile(const char* filename, string& data, bool binaryMode = false);

int main() {
	string filename = "test.bin";
	string text = "Sample";
	
	saveToFile(filename.c_str(), text, true);
}

void saveToFile(const char* filename, string& data, bool binaryMode) {
	ofstream pFileHandler;
	pFileHandler.open(filename, binaryMode ? ios::binary : ios::out);
	if (pFileHandler) {
		pFileHandler.write(data.c_str(), sizeof(data));
		pFileHandler.close();
	}
}

 

A tutaj jest wizualna reprezentacja tego pliku:

 

Offset zaznaczony na zielono to mój string "Sample" wraz ze znakiem końca linii. Żółty offset reprezentuje rozmiar tego stringa w postaci 4 bajtowego inta. Co znajduje się pod offsetem 0x14 - 0x17? Co oznacza CC? Dlaczego w ogóle występuje reszta tego śmiecia? Dlaczego łączny rozmiar pliku to 28b, a nie 11b (długość stringa (7b) + informacja o jego rozmiarze (4b))? Gdy zapiszę do pliku zwykłego inta o wartości powiedzmy 10 to zapisany zostaje tylko ten int (4 bajty). Tak samo jest z char.

Czy ktoś może mi to KOMPLEKSOWO wyjaśnić?

 

Z góry dziękuję.

1 odpowiedź

+3 głosów
odpowiedź 6 listopada 2020 przez tangarr Mędrzec (154,860 p.)
Razem z napisem przepisałeś do pliku losową część pamięci.
Twój napis jest krótki, więc znalazł się w specjalnym statycznym buforze wewnątrz klasy string. Z tego co się orientuję ten bufor może pomieścić 15 znaków (prawdopodobnie +1 dla znaku końca linii).
Przepisałeś do pliku cały ten bufor, kawałek wewnętrznej struktury obiektu string (stąd rozmiar napisu) oraz prawdopodobnie kawałek innej pamięci.

Stało się tak ponieważ jako długości danych do zapisu użyłeś rozmiaru klasy sizeof(string) a nie długości napisu data.size().
komentarz 6 listopada 2020 przez HydeFromT70s Nowicjusz (170 p.)

Dzięki za szczegółowe wyjaśnienie tego zagadnienia. Tak podejrzewałem, że ma to coś wspólnego z faktem, że napis "Sample" jest obiektem klasy string.

Stało się tak ponieważ jako długości danych do zapisu użyłeś rozmiaru klasy sizeof(string) a nie długości napisu data.size().

W sumie ma to sens, jakby się nad tym zastanowić :)

Podobne pytania

0 głosów
1 odpowiedź 333 wizyt
pytanie zadane 9 lutego 2020 w C i C++ przez Konrad Gałach Użytkownik (880 p.)
0 głosów
1 odpowiedź 619 wizyt
0 głosów
1 odpowiedź 469 wizyt
pytanie zadane 2 grudnia 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)

92,568 zapytań

141,420 odpowiedzi

319,618 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...