fstream plik;
plik.open(nazwa, ios::in | ios::binary); // otwieramy plik
plik.seekg(0, ios::end); // przesuwamy wskaźnik odczytu na koniec pliku
unsigned n = plik.tellg() / sizeof(unsigned short); // odczytujemy pozycję wskaźnika - jako że jest na końcu dostaniemy rozmiar pliku
plik.seekg(0, ios::beg); // przesuwamy wskaźnik z powrotem na początek
unsigned short *tablica = new unsigned short[n]; // znamy rozmiar więc tworzymy tablicę
plik.read((char*)tablica, n * sizeof(unsigned short)); // wczytujemy wszystkie short'y
plik.close(); // zamykamy plik
plik.open(nazwa, ios::out);
// ...
Do tego wypada sprawdzić błędy otwarcia/odczytu, zwłaszcza należy sprawdzić czy udało się odczytać rozmiar (n) zanim utworzymy tablicę.
I jeszcze jedna uwaga. Jeśli program ma działać zarówno na systemach big-endian jak i little-endian to trzeba sobie ustalić jakiego endiana używamy w pliku i podczas wczytywania/zapisywania zamieniać kolejne pary bajtów miejscami jeśli endian systemowy jest różny od tego ustalonego dla pliku.