2017-12-07 19 views
0

私は単純なint型のベクトルを持っており、バイナリファイルに書きたいと思っています。例えば:私は16進モードでファイル "binary_ints.data" を調べる場合C++バイナリファイル - ints - strangeの動作を書く

#include <fstream> 
#include <vector> 

int main() { 
    std::vector<uint32_t> myVector{5, 10, 15, 20 }; 
    // write vector to bin file 
    std::ofstream outfile("./binary_ints.data", std::ios_base::binary|std::ios::trunc); 
    std::copy(myVector.begin(), myVector.end(), std::ostreambuf_iterator<char>(outfile)); 
    outfile.close(); 
    return 0; 
} 

はその後、私はこれを持っている:

00000000: 050a 0f14 0a 

は大丈夫厥! myVectorは、このデータを持っている場合

はしかし、:

std::vector<uint32_t> myVector{3231748228}; 

その後、保存された六角は奇妙です:ヘックスで

00000000: 840a 

84何が起こっているのInt 3231748228.

と一致していません。ここに?おかげさまで

+2

'std :: copy'はある要素を複数の新しい要素に変換するのではなく、' std :: ostreambuf_iterator'も変換しません。 – chris

+2

'int'値が> 255の場合に何が起こるかを見るためにいくつかの実験を行ったことがあります。 – PaulMcKenzie

+2

実際にはベクトルデータの一部である以外の改行がどこから来るのか不思議です。プログラムはベクタデータの後に書き込むべきではありません。 –

答えて

3

std::vector<uint32_t>の各値は、std::copy()の呼び出し時にcharと解釈されるという問題があります。 3231748228は、16進数で‭C0A09084と表されます。 std::copy()uint32_tの値をとり、それを0x84Little-endianプロセッサの1バイトに切り捨てます。バイト0x84をファイルバイト0x0aに書き込んだ後には、new line characterに対応します。

可能な解決策は、std::copy()の代わりofstream::write()を使用することである。

#include <fstream> 
#include <vector> 

int main() { 
    std::vector<uint32_t> myVector{3231748228 }; 
    // write vector to bin file 
    std::ofstream outfile("./binary_ints.data", std::ios_base::binary|std::ios::trunc); 

    outfile.write (
     (char*)(myVector.data()), 
     myVector.size() * sizeof (decltype (myVector)::value_type)); 

    outfile.close(); 
    return 0; 
} 
decltype()

注の使用。 sizeof (uint32_t)と書くだけで同じ効果が得られるかもしれませんが、decltype()の場合は、myVectorの値の型を変更してもコードが正しいと確信することがあります。