• 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

VPS Starter Arubacloud
0 głosów
207 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 (155,140 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ź 371 wizyt
pytanie zadane 9 lutego 2020 w C i C++ przez Konrad Gałach Użytkownik (880 p.)
0 głosów
1 odpowiedź 831 wizyt
0 głosów
1 odpowiedź 567 wizyt
pytanie zadane 2 grudnia 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)

93,081 zapytań

142,045 odpowiedzi

321,464 komentarzy

62,427 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...