Поиск конкретных примитивов в двоичном файле

Есть ли способы найти конкретный примитив в двоичном файле (например, fread в MATLAB или BinaryReadLists в Mathematica)? В частности, я хочу сканировать мой файл до тех пор, пока он не достигнет, скажем, с точностью до целого числа int8_t, затем сохранить его в переменной, а затем выполнить поиск другого примитива (беззнаковый символ, двойное число и т. Д.)?

Я переписываю код из MATLAB, который делает это, поэтому формат файла известен.

Я хочу прочитать n байтов только указанного типа (32-битный int, char, ..) в файле. Пример: читать только первые 12 байтов моего файла, если они возвращаются к 8-битным целым числам

0

Решение

Возможно, решение вашей проблемы заключается в понимании разницы между этими двумя документами:

http://www.mathworks.com/help/matlab/ref/fread.html
http://www.cplusplus.com/reference/cstdio/fread/

Обе версии fread позволяют извлекать массив элементов из двоичного файла. Из вашего вопроса я предполагаю, что вы знаете размер и форму нужного вам массива.

#include <stdio.h>

int main() {
const size_t NumElements = 128; // hopefully you know
int8_t myElements[NumElements];
FILE *fp = fopen("mydata.bin", "rb");
assert(fp != NULL);
size_t countRead = fread(myElements, sizeof(int8_t), NumElements, fp);
assert(countRead = NumElements);

// do something with myElements
}
0

Другие решения

Ваш вопрос не имеет смысла для меня, но вот куча случайной информации о том, как читать двоичный файл:

struct myobject { //so you have your data
char weight;
double value;
};
//for primitives in a binary format you simply read it in
std::istream& operator>>(std::istream& in, myobject& data) {
return in >> data.weight >> data.value;
//we don't really care about failures here
}
//if you don't know the length, that's harder
std::istream& operator>>(std::istream& in, std::vector<myobject>& data) {
int size;
in >> size; //read the length
data.clear();
for(int i=0; i<size; ++i) { //then read that many myobject instances
myobject obj;
if (in >> obj)
data.push_back(obj);
else //if the stream fails, stop
break;
}
return in;
}
int main() {
std::ifstream myfile("input.txt", std::ios_base::binary); //open a file
std::vector<myobject> array;
if (myfile >> array) //read the data!
//well that was easy
else
std::cerr << "error reading from file";
return 0;
};

Также вы можете использовать .seek(position) член ifstream чтобы перейти непосредственно к определенной точке файла, если вы знаете, где найти данные, которые вы ищете.

О, вы просто хотите прочитать первые 12 байтов файла как 8-битные целые числа, а затем следующие 12 байтов как int32_t?

int main() {
std::ifstream myfile("input.txt", std::ios_base::binary); //open a file

std::vector<int8_t> data1(12); //array of 12 int8_t
for(int i=0; i<12; ++i) //for each int
myfile >> data1[i]; //read it in
if (!myfile) return 1; //make sure the read succeeded

std::vector<int32_t> data2(3); //array of 3 int32_t
for(int i=0; i<3; ++i) //for each int
myfile >> data2[i]; //read it in
if (!myfile) return 1; //make sure the read succeeded

//processing
}
0

По вопросам рекламы [email protected]