2013-03-28 5 views
0

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

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

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

+0

Nope. Если у вас есть двоичный файл, но он не знает формат содержимого, тогда невозможно сказать, что это за типы. «int» и «float» и «char *» неразличимы. –

+0

Спасибо. Я должен был упомянуть, но я знаю формат. Я переписываю код из MATLAB, который делает это. – DashControl

+0

Если вы знаете формат, то ..... Я полностью не понимаю ваш вопрос. Если вы знаете формат, почему вы «сканируете, пока не найдете int8_t»? Просто скажите нам, что вы хотите сделать, и шансы, это легко. –

ответ

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

Правильно, я могу это сделать. Но что, если я хочу читать следующие 3 байта как 32-битные целые числа после того, как я прочитал первые 12 как 8-битные. Так или иначе, это не ... грязно? – DashControl

+0

@ user2221493: Я предполагаю, что вы имеете в виду 12 байтов в виде 32-битных целых чисел (всего 3 целых числа). Это довольно просто, вы просто читаете больше. Я привел пример в своем вопросе –

0

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

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 
}