Чтение бинарного файла С++

Пожалуйста помогите. Я не могу прочитать бинарный файл. Длина файла 198944, но мой код читает 374. Я пытался использовать fread, ifstream, WinAPI ReadFile. Это функция, которая читает файл:

std::string ReadThisFile(std::string aPath) {
   FILE *inputstream = fopen(aPath.c_str(),"rb");
   long size;
   size_t result; 
   fseek(inputstream,0,SEEK_END); 
   size = ftell(inputstream); 
   rewind(inputstream); 
   char *buff = new char [size];
   result = fread (buff,1,size,inputstream); 
   std::string ret=buff; 
   fclose(inputstream); 
   delete[]buff; 
   return ret; 
}

Пример файла

Нужна любая помощь, спасибо!


person Boleslav    schedule 15.02.2013    source источник
comment
Вы используете strlen для получения окончательного размера? Вы не можете хранить двоичный контент в строке.   -  person Mahmoud Al-Qudsi    schedule 15.02.2013
comment
Предполагается ли, что файл представляет собой текстовый файл ASCII, который вы хотите загрузить в один std::string? Если нет, используйте другой контейнер. (например, std::vector<unsigned char> или что-то подобное).   -  person WhozCraig    schedule 15.02.2013
comment
Кстати, работа fseek(binary_stream, offset, SEEK_END) не гарантируется (согласно стандарту C 1999 года).   -  person Alexey Frunze    schedule 15.02.2013


Ответы (3)


Если вы знаете, что возвращаемый вами std::string содержит двоичные данные, замените

std::string ret=buff;

с участием

std::string ret(buff, size);
person Jonas Byström    schedule 15.02.2013

Вы не можете поместить двоичные данные в строку. Помните, что строка заканчивается специальным символом '\0', который совпадает с нулевым значением. Если двоичные данные содержат ноль, это то же самое, что и конец строки.

Вероятно, вам следует использовать std::vector<int8_t> для хранения двоичных данных.

person Some programmer dude    schedule 15.02.2013
comment
Спасибо. Да, это была моя проблема. - person Boleslav; 15.02.2013

Проблема здесь:

std::string ret = buff;

Согласно этому, это:

"Копирует заканчивающуюся нулем последовательность символов (C-строку), на которую указывает s."

Таким образом, он останавливается, как только достигается символ 0x00.

Если бы вы возвращали buff (что является опасной практикой) или ваша функция принимала массив символов в качестве входного параметра и просто сохраняла его там, это должно работать. И вы можете захотеть вернуть индикатор длины, иначе C++ не будет знать, насколько велик массив.

person Bernhard Barker    schedule 15.02.2013
comment
Спасибо. Да, это была моя проблема. - person Boleslav; 15.02.2013