2011-01-11 8 views
3

行列の各行をバイナリファイルに書きたいと思います。 私はこのようにそれを書いてみてください。行列のバイナリファイル行へのコピー

for(size_t i = 0; i < matrix.size(); ++i) 
ofile->write(reinterpret_cast<char*>(&matrix[i]), sizeof(uint32_t*sizeof(matrix[i]))); 
{ 
    for(size_t j = 0; j < numcols; ++j) 
    { 
     std::cout << left << setw(10) << matrix[i][j]; 
    } 
    cout << endl; 
} 

...

vector< vector<uint32_t> > matrix; 

が、それは動作しません、私はゴミの番号を取得します。

ありがとうございます。

Ted

+0

本当にバイナリ形式が必要ですか?それは通常、面倒な価値がない。 –

+0

通常...しかし、それがあるとき、それはたくさんの価値があります。 – sly

答えて

0

十分ではありませんでした:

vector< vector<uint32_t> > matrix; 

for(size_t i = 0; i < matrix.size(); ++i) 
    ofile.write((char*)&matrix[i][0], sizeof(matrix[i][0])*matrix[i].size()); 

アウトオブコンテキスト質問:なぜofileポインタ? (確かにこの例にある必要はありません)

+0

Well ofileは私のプログラムの中のポインタです。それは悪いですか(perofrmance-wise)? – Flethuseo

+0

http://stackoverflow.com/questions/161053/c-which-is-faster-stack-allocation-or-heap-allocation – sly

5

いくつかの問題:

  1. &matrix[i]はあなたvector<uint32_t>オブジェクトへのポインタを提供します。ベクトルに含まれるデータへのポインタを使用する場合は、&matrix[i][0]を使用します。

  2. sizeof(matrix[i])は、その内容ではなくベクトルオブジェクトのサイズです。要素の数を取得するにはmatrix[i].size()を使用してください。

  3. sizeof(uint32_t * x)の代わりにsizeof(uint32_t) * xを使用してください。

  4. 第2のforループは実際には最初のforループにネストされていません。あなたはあなたのブレースを並べ替える必要があります。ケースinterjayのガイドラインで

関連する問題