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

Dlaczego funkcja zapisująca stringa binarnie nie działa?

Object Storage Arubacloud
0 głosów
180 wizyt
pytanie zadane 12 lutego 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

Mam sobie taką funkcję:

void WriteStringBinary(string StringToWrite, const char* filePath){
   int ASCII;
   ofstream stream(filePath, ios::binary);
   for(int i=0;i<StringToWrite.length()+1;i++){
        ASCII = StringToWrite[i];
        stream.write(reinterpret_cast<const char*>(&ASCII),sizeof(ASCII));
    }
}

koncepcją było zapisywanie stringów jako znaki ASCII binarnie. Tzn. każdy pojedynczy znak zamieniałoby się na int reprezentującego ten znak (jako ASCII) i ten int byłby zapisywany. Ale wynikiem jest (zakładając, że string to "something"). 

sNULoNULmNULeNULtNULhNULiNULnNULgNUL (gdy był typ short, to było somethingNUL)//(ostatnie NUL rozumiem, bo to \0). Nie da się tego zrobić, czy to dlatego, że castuje się to na chara, który najwyraźniej przyjmuje tego inta jako ASCII (w sensie tak jakby napisać char = int). Gdy między ASCII = [...] i stream.write([...]); wstawiłem cout<<ASCII to normalnie wypisało mi znaki ASCII (z zerem na końcu jako \0) i w ten sposób miało to zapisać..

 

 

komentarz 12 lutego 2018 przez vector Dyskutant (9,200 p.)
nie rozumiem pytania(chyba nie tylko ja).
komentarz 12 lutego 2018 przez Hiskiel Pasjonat (22,830 p.)
No, w moim założeniu, funkcja będzie zapisywała te inty (będą to inty reprezentujące znaki ASCII tzn. będą miały numer odpowiednego znaku ASCII) (przed tym jeszcze unsigned long, jako długość łańcucha) binarnie. A nie tak jak mi to wyszło, czyli sNULoNUL..
komentarz 12 lutego 2018 przez j23 Mędrzec (194,920 p.)

W innym wątku pokazałem Ci, jak zapisywać std::stringa. Po co tak (bez sensu) kombinujesz?

komentarz 12 lutego 2018 przez Hiskiel Pasjonat (22,830 p.)
Wiem jak zapisywać. Najpierw długość stringa +1 dla eol. Potem name.c_str() i dlugosc + 1. Ale myślałem, że da się to jakoś binarnie zapisać.
komentarz 12 lutego 2018 przez j23 Mędrzec (194,920 p.)

A po co to +1? Jak zapisujesz długość łańcucha, to to zero na końcu nie jest Ci do niczego potrzebne.

komentarz 12 lutego 2018 przez Hiskiel Pasjonat (22,830 p.)
Aha, sorry. Długość łańcucha nie, tylko przy zapisywaniu stringa. Machnąłem się.
komentarz 12 lutego 2018 przez j23 Mędrzec (194,920 p.)
Tego zera na końcu łańcucha znakowego nie zapisuj, bo nie ma takiej potrzeby.
komentarz 12 lutego 2018 przez Hiskiel Pasjonat (22,830 p.)
Dlaczego więc autor książki "C++. Przewodnik dla początkujących" przy linijce w której zapisuje string binarnie, w drugim argumencie podaje dlugosc + 1 i potem komentarz "// + 1 na znak końca NULL"?

Tak się kiedyś zapisywało czy jak?
komentarz 12 lutego 2018 przez j23 Mędrzec (194,920 p.)

Zero na końcu łańcucha znakowego oznacza jego koniec. Zatem jeśli zapisujesz do pliku najpierw długość łańcucha, później sam łańcuch, to ten znacznik końca (zero) jest zbędny. Przy czytaniu z pliku do std::stringa to zero samo się doda.

 

Dlaczego autor książki zapisuje to zero - nie wiem. Ludzie różne rzeczy w książkach piszą, nie zawsze z sensem ;)

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 211 wizyt
0 głosów
1 odpowiedź 129 wizyt
pytanie zadane 27 października 2020 w C i C++ przez TOWaD Mądrala (5,700 p.)
0 głosów
1 odpowiedź 341 wizyt
pytanie zadane 17 grudnia 2018 w C i C++ przez tomekrx Nowicjusz (160 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...