2016-10-11 3 views
0

Адаптирования части коды я видел в SO, я вышел со следующим раствором:Противоречивый выход при чтении двоичного файла

fstream file("sample.bin", ios::binary | ios::in | ios::ate); 

unsigned char charsRead[(int)file.tellg()]; 

file.read((char *) &charsRead, sizeof(char*)); 
for(int i=0; i<sizeof(charsRead); i++) 
    cout << (int) charsRead[i] << endl; 
file.close(); 

Это компилировать, но каждый раз, когда выполняются, она возвращает другой вывод , Кто-нибудь знает, почему это происходит?

+0

Вы уверены, что 'sizeof (char *)' делает то, что вы думаете? –

+1

'unsigned char charsRead [(int) file.tellg()];' является нестандартным VLA. Если вам нужно прочитать в буфере 'char', рассмотрите' std :: vector '. – NathanOliver

+0

Mmmm не очень. Но даже когда это число является константой, оно все равно возвращает разные выходы при выполнении разных времен, поэтому это не объясняет изменения. –

ответ

2

Я полагаю, что первые 4 (или 8) байта когда-либо равны и что разные выходные данные начинаются с 5-го или 9-го байта.

Как указано πάντα ῥεῖ, вы читаете sizeof(char*) байт (обычно 4 или 8 байт), и вы печатаете sizeof(charsRead) байт.

Если sizeof(char*) < sizeof(charsRead) (то есть: если тусклая файла больше, что 4 или 8), вы пишете

  • sizeof(char*) инициализированы чарсы
  • sizeof(charsRead) - sizeof(char*) неинициализированные символов (так, случайные значения).
+0

Я до сих пор ничего не понимаю. Даже если это неправильно, почему вывод несогласован, учитывая тот же входной файл? –

+1

@AlvaroGomez - Я попытался объяснить это в своем ответе; короткий ответ: вы ** не ** читаете входной файл, вы печатаете случайные значения – max66

0

Я все еще не понимаю выход, но я нашел довольно последовательное решение для чтения двоичного файла с использованием буфера. http://www.cplusplus.com/doc/tutorial/files/

Смежные вопросы