2017-01-20 5 views
0

バイナリファイルの読み込みに問題があります。これまでバイナリファイルからdoubleを読み込んでベクトルに保存する方法

マイコード:

ifstream file("ns.bin", ios::in | ios::binary | ios::ate); 
file.seekg(0, std::ios::end); 
size = file.tellg(); 
file.seekg(0, std::ios::beg); 
buffer = new char[size]; 
file.read(buffer, size); 
file.close(); 

double* double_values = (double*)buffer;//reinterpret as doubles 

私の質問は:または、可能でない場合

vector<double> buffer2; 

を:どのように私はこのタイプのベクターにdouble_valuesからダブルスを取得するにはどうすればよいです私はdouble_valuesから二倍の数を得るのですか?

sbが私に感謝することを願っています!

答えて

0

ちょうどベクターにそれをコピーします。

vector<double> buffer2(double_values, double_values + (size/sizeof(double))); 

説明:

これは開始イテレータと終了イテレータを見込んstd::vector(オプション4 here)、のイテレータのコンストラクタを使用しています。ポインタはイテレータであり、イテレータを終了するには配列内の要素数を知る必要があります。

配列が何バイトであるか分かります。したがって、合計サイズを1つのdouble要素のサイズで割ると、配列の全長が得られます。

次に、イテレータを開始するサイズを追加して、終了イテレータを見つけることは簡単になります。

+0

ありがとう!あなたはaswerと良い説明:)私は別の質問が多分あなたはアイデアを持っている:)私はcoutとベクトルを印刷しようとしたと私はダブルサイズ/ sizeof(ダブル)の数を設定...とそれが動作します。それはすべてのダブル(size/sizeof(double)も正しい数字です)を印刷しますが、最後にはsthも表示されますが、スペースを印刷しているようには見えません。だから私は2dここに彼はprintinいくつかの0秒です...あなたはなぜアイデアを持っていますか? – Ildon

+0

あなたの問題が何であるかを知るのは少し難しいですが、最後の要素を過ぎて印刷しようとしていると思います。 'cout << buffer2 [buffer2.size()]'は未定義の振る舞いです –

0

最初に問題があります。完全にここで答えている:私も直接戻るバイナリとに変数をコピーすることが賢明であると発言したいHow to initialize std::vector from C-style array?

const int size = 64; 
char* chars = new char[64]; 
double* double_values = (double*)chars; 

const int size_of_doubles = (sizeof(char)*size)/sizeof(double); 
std::cout<<"Doubles: "<<size_of_doubles<<'\n'; 
std::vector<double> buffer2(double_values, double_values+size_of_doubles); 
std::cout<<buffer2.size(); 
delete chars; 

。タイプのサイズ、エンディアン、または(テキストの場合)エンコーディングなどの問題が発生し、異なるコンピュータでプログラムが壊れる可能性があります。

+0

'double_values'はポインタ型であり配列型ではないので、' std :: end'がこの場合に動作するとは思えません。http://en.cppreference.com/w/cpp/iterator/end –

+0

@RussellGreene True、修正されました。 –

関連する問題