/ / Zapisz wektor obiektów do pliku C ++ - c ++, plik, obiekt, wektor, zapisz

Zapisz wektor obiektów do pliku C ++ - c ++, plik, obiekt, wektor, zapisz

Mam przedmiot reprezentujący jednostkękafelki ziemi w grze, którą programuję. Mam również wektor przechowujący instancje obiektu. Jaki jest najlepszy sposób na zapisanie tej listy w pliku? Mógłbym zapętlić wektor i zapisać każdą współrzędną x, y i jakiego obrazu używa obiekt, ale to wydaje się trochę prymitywne. Mogę używać plików nagłówkowych doładowania, ale obecnie mam poważne problemy, kiedy próbuję zbudować i użyć reszty doładowania. Jakieś sugestie?

Odpowiedzi:

1 dla odpowiedzi № 1

C ++ nie ma wbudowanej funkcji serializacji,więc cokolwiek zrobisz, będzie trochę „prymitywne”, na ogół, jeśli obiekty, które zapisujesz, wymagają niewielkiej lub teraz budowy (takie jak int, float itp.), możesz po prostu napisać cały wektor za jednym razem, tak :

std::vector <int> data(16, 0);
std::ofstream output("binary.data");
output.write(static_cast<char *>(&(data[0])), data.size()*sizeof(int));

Jeśli jednak masz typy danych wymagające konstruktorów wieloetapowych (takie jak std :: string), to ty musi zapętlaj każdy element i wypisz je indywidualnie z wystarczającą ilością informacji, aby zrekonstruować obiekty podczas odczytu z dysku.


1 dla odpowiedzi nr 2

To z pewnością wydaje się wystarczająco dobrym rozwiązaniemDla mnie. format podobny do: {x, y, image_filename} również ułatwiłoby debugowanie, ponieważ możesz, w drodze inspekcji, sprawdzić, czy Twój kod zapisywania lub kod ładowania powoduje problemy (jeśli wystąpią jakieś problemy). Nie wyobrażam sobie, że i tak możesz zaoszczędzić dużo miejsca, używając rozwiązania binarnego, ponieważ najprawdopodobniej potrzebujesz pełnej nazwy pliku obrazu_pliku.

Możesz na co spojrzeć Boost :: Serialization oferuje.


0 dla odpowiedzi № 3

W pełni popieram Boost :: Serialization. Możesz faktycznie wybrać, czy chcesz tekstlub format binarny. Zwykle piszę do / czytam z archiwów tekstowych podczas programowania / debugowania, a następnie przełączam się na format binarny w celu wdrożenia. Zauważ, że format binarny to nie przenośne między różnymi architekturami, więc trzymaj się formatu tekstowego, jeśli przenośność archiwum jest dla Ciebie ważna.

Jeśli Twoje obiekty ulegną zmianie lub chcesz serializować klasy pochodne, możesz to zrobić bardzo łatwo, a także możesz wykonać wersjonowanie archiwów. Naprawdę nie ma potrzeby ponownego wdrażania tego konkretnego koła :-)

Może możesz podać więcej informacji o problemach z instalacją Boost (wersja? OS? Kompilator?), Na pewno ktoś pomoże.