konwersja char na unsigned char

0

Wczytuje binarnie 8 bitowy plik raw reprezentujący mapę wysokości - gdzie każdy piksel może przyjmować wartość z zakresu [0,255]. Funkcja read przyjmuje argument typu char, a ja potrzebuje pracować na typie unsigned char, więc robię rzutowanie. Czy wszystko jest poprawnie/optymalnie ?

ifstream file ("heightMap.raw", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
     size = file.tellg();
     heightMap = new  char [size];
     uheightMap = new unsigned char [size];
     file.seekg (0, ios::beg);
     file.read (heightMap, size);
     file.close();
     uheightMap = reinterpret_cast<unsigned char*>(heightMap); 
     delete [] heightMap;
}
0
ifstream file ("heightMap.raw", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
     size = file.tellg();
     heightMap = new  char [size];
     uheightMap = new unsigned char [size];
     file.seekg (0, ios::beg);
     file.read (heightMap, size);
     file.close();
     uheightMap = reinterpret_cast<unsigned char*>(heightMap); 
     delete [] heightMap;
}

Nie! Nie możesz usunąć heightmapy w tym momencie, a jeśli to zrobisz to uheightmap jest w tym momencie również do wyrzucenia.
Nie mówiąc o tym że przy przypisaniu jednocześnie tracisz dostęp do poprzednio zaalokowanej pamięci w uheightmap.
Przypisanie wskaźnika nie ma nic wspólnego z kopiowaniem danych.

Rozwiązanie - najprościej usunąć new unsigned char[size], usunąć delete [] heightMap;

ifstream file ("heightMap.raw", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
     size = file.tellg();
     heightMap = new  char [size];
     file.seekg (0, ios::beg);
     file.read (heightMap, size);
     file.close();
     uheightMap = (unsigned char*)(heightMap); 
}

Tylko z tym jest pewien problem - nie możesz zwalniać pamięci z innego typu wskaźnika niż alokujesz. Proponuję:

ifstream file ("heightMap.raw", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
     size = file.tellg();
     uheightMap = new  unsigned char [size];
     file.seekg (0, ios::beg);
     file.read ((char*)uheightMap, size);
     file.close();
}

A, i z tego co pamiętam, można jeszcze tak:

basic_ifstream<unsigned char> file ("heightMap.raw", ios::in|ios::binary|ios::ate); // basic_ifstream<unsigned char>
if (file.is_open())
{
     size = file.tellg();
     uheightMap = new  unsigned char [size];
     file.seekg (0, ios::beg);
     file.read (uheightMap, size);
     file.close();
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1