Wczytywwanie z pliku binarnego do vectora

0

Hey,
Chciałem się zapytać czy poniższy kod zapisujący dane z pliku binarnego jest poprawny? Chodzi o to, że chcę skopiować dane z pliku binarnego do vectora - czyli rezerwuję w vektorze odpowiednią ilość miejsca a następnie zaczynając od wskaźnika wskazującego na jego pierwszy element kopiuję dane... Nie wiem, czy tak powinno się robić, ale nie przychodzi mi nic innego do głowy - poza utworzeniem tymczasowej tablicy dynamicznej a następnie jej skopiowanie do vectora...

		void LoadBinary(string filename)
			{
			size_t tmp_size = 0;
			ifstream fin(filename, ios::binary);

			fin.read((char *)(&tmp_size), sizeof(size_t));
			m_dane.resize(tmp_size);

			fin.read((char *)(&m_dane[0]), sizeof(MyClass)*tmp_size);	//TO NIEZBYT MIŁO WYGLĄDA...

			fin.close();
			}

Z góry dziękuję za pomoc.

0

Jeśli chcesz, żeby wyglądało to milej - użyj Boost.Serialization

0
spartanPAGE napisał(a):

Jeśli chcesz, żeby wyglądało to milej - użyj Boost.Serialization

W takim razie, z kontekstu wnioskuję, że mój kod jest jednak poprawny? ;-)

0

To, czy jest poprawny, zależy od tego, jak wygląda definicja klasy MyClass.

1

W takim razie, z kontekstu wnioskuję, że mój kod jest jednak poprawny? ;-)

Poprawny - tak. Dobry - nie. Ten sposób jest znacznie lepszy:

void load_binary(const std::string &file_name)
{
    std::ifstream input_file(file_name, std::ios::binary);
    std::vector<char> input_buffer(std::istreambuf_iterator<char>(input_file),
                                   std::istreambuf_iterator<char>());
    input_file.close();
} 

Generalnie do takich rzeczy o wiele wygodniej jest stosować iteratory strumieniowe z nagłówka <iterator> (tu std::istreambuf_iterator). Możesz wtedy iterować sobie po strumieniu plikowym tam i nazad, aplikować algorytmy typu std::copy, std::find_if no i robić inne cud na kiju. Obaczaj sobie posty np. w tym temacie: Pojawiające się w programie liczby nie wiadomo skąd .. jako podgląd możliwości.
Najważniejsza sprawa jest taka, że wszystko dzieje się automagicznie, bez konwersji, resize-owania itp.

0

@yurai, jestem zwolennikiem stosowania STL w całej jego rozciągłości, ale w tej sytuacji zdecydowanie się z tym nie zgodzę. Zastosowanie istreambuf_iterator faktycznie wygląda "ładnie", ale tylko gdy chcemy otrzymać standardowy kontener charów. A przecież mało który plik tak wygląda. Najczęściej mamy jakieś struktury czy binarne wartości liczbowe. Bez rzutowania się raczej nie obejdzie w takim wypadku. A ta "automagiczność" w tym wypadku tylko nam przeszkadza, bo dzięki oryginalnemu zastosowaniu reserve z pobraną z pliku liczbą unikniemy późniejszych wielokrotnych realokacji pamięci wektora.

Beggi, nie używaj w takich przypadkach size_t. Do struktur plików użyj typów z stdint.h.

1 użytkowników online, w tym zalogowanych: 0, gości: 1