Недавно я задал еще один вопрос о разборе двоичного файла, и я вроде как получил его для работы благодаря всем здесь.Чтение двоичного файла пошагово
Но я сейчас сталкиваются с новой проблемой, и я нуждаюсь в помощи, пожалуйста, голые со мной.
Мой бинарный файл выглядит примерно так, но гораздо дольше ...
ST ......... ¸. ° Ý.ø ... 0.œ ...... ..... ESZ4 1975 .......... IYH.testDBDBDBDBST ........... ° Ý.ø ............... .... DBDBDBDBST ......... P.'Ý.ø ... 0.œ ........... ESZ4 1975 .......... HTC .testDBDBDBDBST ......... <,'Ý.ø ................... DBDBDBDBST ......... ƒD.Þ. ø ... 0.œ ........... ESZ4 1975 .......... ARM.testDBDBDBDBST ......... «E.Þ.ø .. ................. DBDBDBDB
В принципе, каждое сообщение начинается с «ST» и заканчивается «DBDBDBDB». Цель состоит в том, чтобы проанализировать каждое сообщение и сохранить сообщение в структуре данных. Кроме того, каждое сообщение отличается в зависимости от типа, и у другого типа сообщения будут дополнительные члены.
Проблема у меня есть, я понятия не имею, как итерации через этот двоичный файл ... Если его обычный файл, я могу просто сделать while (getline (файл, s)), но как насчет бинарного файла ?? Есть ли способ сказать, найти первые «ST» и «DBDBDBDB» и проанализировать средний материал, а затем перейти к следующему набору ST и DB? Или каким-то образом прочитайте файл, постепенно отслеживая, где я?
Приносим извинения за время размещения столько кода.
#pragma pack(push, 1)
struct Header
{
uint16_t marker;
uint8_t msg_type;
uint64_t sequence_id;
uint64_t timestamp;
uint8_t msg_direction;
uint16_t msg_len;
};
#pragma pack(pop)
struct OrderEntryMessage
{
Header header;
uint64_t price;
uint32_t qty;
char instrument[10];
uint8_t side;
uint64_t client_assigned_id;
uint8_t time_in_force;
char trader_tag[3];
uint8_t firm_id;
char firm[256] ;
char termination_string[8];
};
struct AcknowledgementMessage
{
Header header;
uint32_t order_id;
uint64_t client_id;
uint8_t order_status;
uint8_t reject_code;
char termination_string[8];
};
struct OrderFillMessage
{
Header header;
uint32_t order_id;
uint64_t fill_price;
uint32_t fill_qty;
uint8_t no_of_contras;
uint8_t firm_id;
char trader_tag[3];
uint32_t qty;
char termination_string[8];
};
void TradeDecoder::createMessage()
{
ifstream file("example_data_file.bin", std::ios::binary);
//I want to somehow Loop here to keep looking for headers ST
Header h;
file.read ((char*)&h.marker, sizeof(h.marker));
file.read ((char*)&h.msg_type, sizeof(h.msg_type));
file.read ((char*)&h.sequence_id, sizeof(h.sequence_id));
file.read ((char*)&h.timestamp, sizeof(h.timestamp));
file.read ((char*)&h.msg_direction, sizeof(h.msg_direction));
file.read ((char*)&h.msg_len, sizeof(h.msg_len));
file.close();
switch(h.sequence_id)
{
case 1:
createOrderEntryMessage(h); //this methods creates a OrderEntryMessage with the header
break;
case 2:
createOrderAckMessage(h); //same as above
break;
case 3:
createOrderFillMessage(h); //same as above
break;
default:
break;
}
}
Много много спасибо .....
Если вы собираетесь обрабатывать двоичные файлы, вы должны установили своего рода макет, описывающий запись файла. Например, байты 0-4 - это размер, байты 5-15 - это имя, байты 16-20 и т. Д. Из вашего сообщения, похоже, единственное, что вы описали таким образом, это запись заголовка - вы сделали Не делайте этого для других типов записей, найденных в файле. – PaulMcKenzie
Другие типы также указаны. Каждое сообщение содержит заголовок, а размер сообщения указывается в заголовке. –
Вы считали [читать()] (http://en.cppreference.com/w/cpp/io/basic_istream/read)? Поскольку вы говорите, что заголовок имеет эту информацию, вы читаете количество указанных байт. – PaulMcKenzie