2015-02-24 36 views
5

Potrzebuję przeczytać duży plik binarny (~ 1GB) w std::vector<double>. Obecnie używam infile.read, aby skopiować całą rzecz do bufora char * (pokazanego poniżej) i obecnie planuję przekonwertować całość na doubles z reinterpret_cast. z pewnością musi być sposób, aby po prostu umieścić doubles prosto w vector?jak sprawnie odczytać plik binarny do wektora C++

Nie jestem też pewien, co do formatu pliku binarnego, dane zostały wyprodukowane w python więc to chyba wszystko pływa

ifstream infile(filename, std--ifstream--binary); 

infile.seekg(0, infile.end);  //N is the total number of doubles 
N = infile.tellg();    
infile.seekg(0, infile.beg); 

char * buffer = new char[N]; 

infile.read(buffer, N); 
+0

Czy istnieje powód, dla którego chcesz użyć podwójnych? Dane binarne są zwykle reprezentowane jako znak, ponieważ na większości platform zajmuje on jeden bajt. – Freddy

+4

Jeśli nie znasz formatu pliku, w jaki sposób planujesz go przekonwertować? –

+1

Ummmmm .... chcesz odczytać plik binarny nie znający formatu jako czegoś innego niż tylko strumień bajtów? – luk32

Odpowiedz

7

Zakładając, że cały plik jest podwójne, inaczej to przyzwyczajenie praca poprawnie.

std::vector<double> buf(N/sizeof(double));// reserve space for N/8 doubles 
infile.read(reinterpret_cast<char*>(buf.data()), buf.size()*sizeof(double)); // or &buf[0] for C++98 
+0

Deklaracja zero inicjuje, co wydaje się nieco nieekonomiczne. –

+0

@AlanStokes Z drugiej strony operacja IO prawdopodobnie jest wąskim gardłem. Powiedziałbym, że to w porządku, dopóki pomiar nie potwierdzi tego. –

+0

Na pewno nie chcesz (i na pewno nie możesz) zapisać 1 GB danych w 'std :: array'. –