2016-01-12 8 views
8

続く、ファイルにベクトル を書くことができます。グループの終わりに、私はIDグループを追加し、それらに(グループデータ+そのID)をファイルに書きたいと思います。グループIDタイプは integerです。私は以下のコードでその作業を行います。それが正しいか? 怒鳴る図は、私が追加で は、どのように私はグループに5つの<code>unsigned char</code>ベクトル(<code>data_length=5</code>)を持っているunsigned int型

enter image description here

#define random(x) (rand()%x) 
std::ofstream filewrite("abc.raw", std::ios::out | std::ofstream::binary); 
unsigned int iter = 0; 
unsigned int data_length=5; 
unsigned int ID_data=0; 
//-------------Write data-------------// 
while (iter<10){ 
    vector<unsigned char> vec_data; 
    for (unsigned int i=0;i<data_length;i++){ 
     vec_data.push_back(random(256)) 
    }   
    std::copy(vec_data.begin(), vec_data.end(), std::ostreambuf_iterator<char>(filewrite)); 
    //Write ID_data after vec_data 
    filewrite.write(reinterpret_cast<const char *>(&ID_data), sizeof(ID_data)); 
    ID_data++; 
    iter++; 
} 
filewrite.close(); 

を取っているかを示して、私はグループIDなしベクトルにデータを抽出したいです。これは、上記のファイルからデータを抽出する私のコードですが、IDグループは削除されません。それを取り除く手伝いをしてもらえますか?

//-------------Read data-------------// 
std::ifstream file("abc.raw", std::ios::binary); 
// Stop eating new lines in binary mode!!! 
file.unsetf(std::ios::skipws); 

// get its size: 
std::streampos fileSize; 

file.seekg(0, std::ios::end); 
fileSize = file.tellg(); 
file.seekg(0, std::ios::beg); 

// reserve capacity 
std::vector<unsigned char> vec; 
    vec.insert(vec.begin(), 
std::istream_iterator<unsigned char>(file), 
std::istream_iterator<unsigned char>()); 
+0

場合、私はあなたがコードレビューのセクションでそれを尋ねる必要がありますね。 –

+2

の代わりに間違って何が起こっているかの解釈を与え、観察結果を提供します。あなたの質問は不明です。 –

+4

質問の前半はそれが動作するかどうかに関しては不明である@MehrdadMomeny。 2番目の部分は間違いなく**意図どおりに動作していないので、この時点では[codereview.se]は不適切です。 P – Kaz

答えて

2

forが読みやすくなりますまず第一に、あなたはwhileを使用し、。 BTW。 2つの反復変数は必要ありません。 ID_dataを繰り返しても問題ありません。

for(unsigned int ID_data = 0; ID_data < 10; ++ID_data) { 
    // ... 
} 

秒は、ベクトルを生成する必要がなく、再利用しないで、要素を書き込む必要はありません。値を直接書き込むことは問題ありません。

for(unsigned int ID_data = 0; ID_data < 10; ++ID_data) { 
    for(unsigned int i = 0; i < data_length; i++) 
     filewrite.put(random(256)); 

    filewrite.write(reinterpret_cast<const char *>(&ID_data), sizeof(ID_data)); 
} 

第2部:2つのイテレータでベクトルをインスタンス化できます。

auto vec = std::vector<unsigned char>(std::istream_iterator<unsigned char>{file}, 
             std::istream_iterator<unsigned char>{}); 

しかし、あなたは唯一のdata_length値を読みたいので、あなたが好むかもしれないが:このコードが動作している

auto vec = std::vector<unsigned char>{}; 

while(file) { 
    for(unsigned int i = 0; i < data_length; i++) { 
     char c; 
     if(!file.get(c)) 
      break; 
     vec.push_back(static_cast<unsigned char>(c)); 
    } 

    unsigned int ID_data; 
    file.read(reinterpret_cast<const char *>(&ID_data), sizeof(ID_data)); 
    // we don't use ID_data here, so it will simply be ignored. 
} 
+0

ありがとうございますが、&std :: basic_istream > :: get(std :: basic_streambuf >&、_ Elem) 'というエラーがあります:引数1を' unsigned 'std :: basic_istream >&std :: basic_istream :: read(_Elem *、std :: streamsize)' :引数1を 'const char *'から 'char *'に変換できません。これはfile.read(reinterpret_cast (&ID_data)、sizeof(ID_data))である必要があります。とchar c; – Jame

+0

私はそれに応じて私の答えを変更しました。これは今すぐ動作するはずです。 – cdonat

2

あなたの質問を正しく理解しているかどうかはわかりません。私はあなたがバイナリライティングに問題があると仮定しているので、私はあなたにただ一つのベクトルに対する解決策を与えています。あなたは簡単にそれを修正することができます。

void Write(std::ostream& os, const std::vector<std::uint8_t>& v, const std::int32_t id) 
{ 
    std::size_t len = v.size(); 
    os.write((const char*)&len, sizeof len); 
    for (auto e : v) 
    os.write((const char*)&e, sizeof e); 
    os.write((const char*)&id, sizeof id); 
} 

void Read(std::istream& is, std::vector<std::uint8_t>& v) 
{ 
    std::size_t len; 
    is.read((char*)&len, sizeof len); 
    v.resize(len); 
    for (auto &e : v) 
    is.read((char*)&e, sizeof e); 
    std::int32_t id; 
    is.read((char*)&id, sizeof id); 
} 

int main() 
{ 
    // write 
    { 
    std::ofstream os("abc.raw", std::ios::binary); 
    if (! os) 
     return -1; 
    std::vector<std::uint8_t> v; 
    v.push_back(0x10); 
    v.push_back(0x20); 
    v.push_back(0x30); 
    Write(os, v, 0x123); 
    } 

    // read 
    { 
    std::ifstream is("abc.raw", std::ios::binary); 
    if (! is) 
     return -1; 
    std::vector<std::uint8_t> v; 
    Read(is, v); 
    } 

    // 
    return 0; 
} 
+0

IDなしの生データを抽出する方法についての第2の質問 – Jame

+0

IDを読み取ってそれを破棄します。 – ZDF

+1

@ user8430更新された例を参照してください。 – ZDF

関連する問題