Четене на двоичен файл C++

Моля, помогни ми. Не мога да чета двоичен файл. Дължината на файла е 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