reading uchar into ushort

Tags:    c++

Jeg vil gerne kunne læse en bunke bytes ind i en STL vector af shorts. Koden neden for skulle gerne illustrere mit problem. Data bliver ikke indlæst korrekt, nogen der har en ide til hvorledes jeg kan afhjælpe dette?

Altså unsigned char gemt i en fil (0-255) disse tal vil jeg gerne læse ind i en STL vector af short´s, som vist nedenfor... hvorledes gøres dette korrekt?

// 1. Create data
typedef unsigned short data_type;
std::vector<data_type> data;
data.resize( 1024 );

// 2. Open file
std::ifstream ifs;
ifs.open("data.bin",
std::ifstream::in | std::ifstream::binary);

// 3. Read data
ifs.read( reinterpret_cast<char*>( &data.at(0) ),
static_cast<std::streamsize> (sizeof(char) * data.size() ));



Indlæg senest redigeret d. 23.06.2007 18:43 af Bruger #12053
her converters mellem unsigned short og char*:
Fold kodeboks ind/udKode 


og den anden vej:
Fold kodeboks ind/udKode 

Håber det kan hjælpe dig! :)



Indlæg senest redigeret d. 23.06.2007 19:33 af Bruger #6465
std::ifstream::binary
......
og ikke streng gymnastik ;-)


En anden gang er det en god ide at forstå kode + spørgsmål inden man poster. Jeg læser rå data ind fra fil og vil ligge det ind i en vector unsigned short...





Indlæg senest redigeret d. 24.06.2007 11:13 af Bruger #12053
Den eneste fejl jeg lige kan se er at det skal være
sizeof(data_type)

og ikke

sizeof(char)

Ellers vil den kun læse halvdelen af dine data (hvis sizeof(unsigned short) == 2, hvad den typisk er).



øh.. data er bytes (0..255)... og jeg vil altså tvinge hver enkelt byte ind i en short (16 bit). At læse mere ind end hvad der rent faktisk er på disk vil give dig noget af et crash ;-) Som jo rent faktisk er hvad Bertel forslår...

En gennem gang af ifstream findes på hvis du ikke helt er bekendt med C++
http://www.cplusplus.com/reference/iostream/ifstream/

Det er trivielt at læse en gang bytes in i en STL vector af bytes, se eventuelt her under.

std::vector<char> data;
data.resize( 1024 );
std::ifstream ifs;
ifs.open("data.bin",
std::ifstream::in | std::ifstream::binary);
ifs.read( reinterpret_cast<char*>( &data.at(0) ),
static_cast<std::streamsize> (sizeof(char) * data.size() ));

Men hvad nu hvis at vi ændre vectoren til :

std::vector<unsigned short> data;

Vi skal stadig læse bytes in men gemme dem i shorts... der er her udfordringen ligger...





Indlæg senest redigeret d. 24.06.2007 18:40 af Bruger #12053
Jeg overså at dine data lå som 8-bit.

I så fald er du nødt til at læse dem som 8-bit og derpå konvertere dem til 16 bit.

istream::read kan ikke lave denne konvertering for dig.



t