2016-04-15 57 views
2

uint16_t値を含むバイナリファイルを読みたいと思います。私がこれまでにやったことです:std :: vectorの代わりに<uint16_t>のstd :: vectorにバイナリファイルを読み込みます。<char>

std::istreambuf_iterator<char>error: no matching conversion for functional-style cast from 'std::ifstream')が動作しませんを使用して
std::ifstream is; 
std::vector<char> rawfilebuffer; /* should be std::vector<uint16_t> */ 

is.open("uint16_t_file.raw", std::ios::binary); 
is.seekg(0, std::ios::end); 
size_t filesize=is.tellg(); 
is.seekg(0, std::ios::beg); 

rawfilebuffer.reserve(filesize); 
rawfilebuffer.assign(std::istreambuf_iterator<char>(is), 
        std::istreambuf_iterator<char>()); 

istreambuf_iteratorをuint16_tにキャストすることは可能ですか?

+0

に命令のサイズを変更する変更する必要がありますか? – 0x499602D2

答えて

5

std::vectorのメンバーであるdata()を使用して、すべてのファイル(またはファイルが大きすぎる場合は大きなチャンク)を読み取ることができます。

何か注意

#include <vector> 
#include <fstream> 
#include <iostream> 

using myType = uint16_t; 

int main() 
{ 
    std::ifstream is; 
    std::vector<myType> rawfilebuffer; 

    is.open("uint16_t_file.raw", std::ios::binary); 
    is.seekg(0, std::ios::end); 
    size_t filesize=is.tellg(); 
    is.seekg(0, std::ios::beg); 

    rawfilebuffer.resize(filesize/sizeof(myType)); 

    is.read((char *)rawfilebuffer.data(), filesize); 

    for (auto const & ui : rawfilebuffer) 
     std::cout << '[' << ui << ']'; 

    std::cout << '\n'; 

    return 0; 
} 

のようなファイルサイズに。それが sizeof(myType)の正確な倍数であれば、よく。

そうしないと、あなたはあなたがistreambuf_iteratorでuint16_tする文字を変更しました。この方法

rawfilebuffer.resize(filesize/sizeof(myType)+(filesize%sizeof(myType)?1U:0U)); 
関連する問題