fileSize - количество байтов в файле.
sizeof (fileContents) - возвращает размер указателя на символ *.
strlen (fileContents) - подсчитывает количество символов, пока не будет найден символ со значением '0'. Это очевидно после всего лишь 8 символов - поскольку вы читаете двоичные данные, это не является неожиданным результатом.
cout << fileContents - подобно strlen, cout записывает символы, пока не будет найден символ со значением '0'. Из вывода видно, что некоторые символы не могут быть напечатаны. </p>
В вашем примере есть некоторые другие проблемы - например, он не освобождает используемую память. Вот немного более надежная версия:
vector< char > fileContents;
{
ifstream file("htdocs/image.png", ios::in | ios::binary | ios::ate);
if(!file.is_open())
throw runtime_error("couldn't open htdocs/image.png");
fileContents.resize(file.tellg());
file.seekg(0, ios::beg);
if(!file.read(&fileContents[ 0 ], fileContents.size()))
throw runtime_error("failed to read from htdocs/image.png");
}
cout << "size: " << fileContents.size() << endl;
cout << "data:" << endl;
for( unsigned i = 0; i != fileContents.size(); ++i )
{
if( i % 65 == 0 )
cout << L"\n';
cout << fileContents[ i ];
}