2012-02-16 12 views
3

私は心からの努力をしていますが、ここでそのバグを見つけることはできません。私はofstreamにベクトルを書いています。ベクトルにはバイナリデータが含まれています。しかし何らかの理由で、空白文字(0x10、0x11、0x12、0x13、0x20)が書き込まれることになっていると、スキップされます。C++、ベクトル<char>をofstreamスキップの空白に書き込む

私はイテレータを使用して試してみました。直接ofstream :: write()を試しました。

ここに私が使用しているコードがあります。私が試した他の方法のいくつかをコメントアウトしました。

void 
write_file(const std::string& file, 
      std::vector<uint8_t>& v) 
{ 
    std::ofstream out(file, std::ios::binary | std::ios::ate); 

    if (!out.is_open()) 
    throw file_error(file, "unable to open"); 

    out.unsetf(std::ios::skipws); 

    /* ostreambuf_iterator ... 
    std::ostreambuf_iterator<char> out_i(out); 
    std::copy(v.begin(), v.end(), out_i); 
    */ 

    /* ostream_iterator ... 
    std::copy(v.begin(), v.end(), std::ostream_iterator<char>(out, "")); 
    */ 

    out.write((const char*) &v[0], v.size()); 
} 

EDIT:それを読み取るコード。ここで

void 
read_file(const std::string& file, 
      std::vector<uint8_t>& v) 
{ 
    std::ifstream in(file); 
    v.clear(); 

    if (!in.is_open()) 
    throw file_error(file, "unable to open"); 

    in.unsetf(std::ios::skipws); 

    std::copy(std::istream_iterator<char>(in), std::istream_iterator<char>(), 
     std::back_inserter(v)); 
} 

は、例えば、入力された:

30 0 0 0 a 30 0 0 0 7a 70 30 0 0 0 32 73 30 0 0 0 2 71 30 0 0 4 d2 

そしてこれは、私はそれを読み戻すときに私が取得しています出力されます:

30 0 0 0 30 0 0 0 7a 70 30 0 0 0 32 73 30 0 0 0 2 71 30 0 0 4 d2 

あなたが見ることができるように、0x0Aのがommitedされています表面的には空白のためです。

ご意見をいただければ幸いです。

+4

読んだところのコードを表示します。 –

+0

読み取りコードはどのように見えますか?問題はそこにあるかもしれません... – fbrereto

+0

ベクトルの内容が実際にあなたが書き込む前に期待していることを確認しましたか? (例えば、入力ステップは空白を削除する可能性があります...) –

答えて

1

ベクトル<>を直接書き込むのではなく、boost::serializationboost::archive::binary_oarchiveを使用するとより効果的です。

0

「a」は改行として扱われると思います。私はまだこれを回避する方法を考える必要があります。

+0

それはまさに私が考えていることです。 – nerozehl

1

read_file関数でバイナリモードでファイルを開くのを忘れた。

0

デザインによるistream_iteratorは、空白をスキップします。あなたはstdを交換してみてください::コピー本で:

std::copy(
    std::istreambuf_iterator<char>(in), 
    std::istreambuf_iterator<char>(), 
    std::back_inserter(v)); 

istreambuf_iteratorは、あなたが見ているの空白処理を避けることができますストリームバッファオブジェクトに直接行きます。

関連する問題