2015-02-24 17 views
5

Büyük bir ikili dosyayı (~ 1GB) std::vector<double> içine okumalıyım. Şu anda infile.read kullanarak tüm şeyi char * arabelleğe kopyalamak için kullanıyorum (ve aşağıda gösterilen) ve şu anda ile doubles içine tüm şeyi dönüştürmeyi planlıyorum. Kesinlikle doubles'u vector içine koymanın bir yolu olmalı? o yüzden ben de ikili dosya biçimi konusunda emin değilimBir ikili dosyayı bir vektöre verimli şekilde nasıl okuyacağınız C++

, veri muhtemelen tüm dosyanın tamamını varsayarsak

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

Çiftler kullanmak istediğiniz bir neden var mı? İkili veri normalde bir char olarak temsil edilir, çünkü çoğu platformda tek bir bayt kaplar. – Freddy

+4

Dosya biçimini bilmiyorsanız, nasıl dönüştürmeyi planladınız? –

+1

Ummmmm .... biçimi sadece bir bayt akışından başka bir şey olarak bilmeyen bir ikili dosya okumak ister misiniz? – luk32

cevap

7

yüzen python üretildi aksi takdirde bu alışkanlık iş düzgün, iki katı.

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

Bildirgenin sıfır başlatılması, biraz israf gibi görünüyor. –

+0

@AlanStokes Öte yandan, IO işleminin kendisi muhtemelen darboğazdır. Bunun ölçüm kanıtı olana kadar bunun iyi olduğunu söyleyebilirim. –

+0

Kesinlikle 1GB veriyi std :: array'de kaydetmek istemezsiniz (ve kesinlikle yapamazsınız). –

İlgili konular