2016-04-15 7 views
2

Ich möchte eine Binärdatei mit uint16_t Werte lesen. Was ich bisher getan ist:Lesen Sie eine Binärdatei in einen Std :: Vektor <uint16_t> anstelle von Std :: Vektor <char>

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>()); 

std::istreambuf_iterator<char> Mit funktioniert nicht (error: no matching conversion for functional-style cast from 'std::ifstream').

Kann ich istreambuf_iterator in uint16_t umwandeln?

+0

Haben Sie char ändern die Größe ändern in istreambuf_iterator uint16_t? – 0x499602D2

Antwort

5

Mit C++ 11 können Sie das data() Mitglied std::vector verwenden und alle Datei lesen (oder großer Brocken, wenn die Datei zu groß ist).

So etwas wie

#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; 
} 

Aufmerksamkeit auf die Dateigröße. Wenn es ein genaues Vielfaches von sizeof(myType) ist, naja.

Andernfalls sollten Sie Sie Anweisung auf diese Weise

rawfilebuffer.resize(filesize/sizeof(myType)+(filesize%sizeof(myType)?1U:0U)); 
Verwandte Themen