Я написал простой поток, и его задача — просто прочитать данные с жесткого диска, поместить их в контейнер и пометить их меткой времени и уникальным идентификатором. После этого я запишу недавно структурированные данные в файл отображения памяти.
Дело в том, что меня не волнует внутренняя структура данных, я имею в виду, что они могут быть в формате Wav (потому что в реальной ситуации я буду иметь дело с некоторыми аудиоданными, каждая из которых по 3 мегабайта), но я выиграл » не делать никаких операций с этими данными. Вставив его в мою структуру, я буду иметь дело только с уникальным идентификатором и тегом данных. Структура образца будет выглядеть примерно так:
Struct SampleData
{
long UniqueID;
... MyData; // the data which I am trying to read from hard drive
Time insertionTime;
}
Итак, вопрос в том, как я собираюсь читать данные Wav в эту структуру, не зная (потому что мне это не нужно) ее внутреннюю структуру? Что будет ...
часть например. Есть ли тип контейнера для большого блока данных?
Для чтения данных я могу использовать ifstream
или любой другой метод?
Попробуйте сохранить его в формате TLV:
http://en.wikipedia.org/wiki/Type-length-value
РЕДАКТИРОВАТЬ:
Очень простой контейнер для TLV.
Вы сможете хранить исходные данные как есть, и вы будете знать, какое поле вы читаете и каков его размер.
class TlvContainer
{
public:
unsigned long Type; // Maybe we have billions of types of objects?
unsigned long Size; // The size of the object.
unsigned char* Bytes; // This will hold the raw data.
};
Когда вы записываете свои данные в файл, вы должны знать, сколько их байтов, выделить массив «Байты» и обновить поле «Размер».
Когда вы прочитаете его из файла, вы узнаете, как вы его записали. (Вам придется читать поля в том же порядке, в котором вы их написали.)
Например, если вы написали это как: тип, размер, байт:
Сначала вы прочитаете sizeof (unsigned long) из файла, чтобы узнать тип элемента.
Затем вам нужно прочитать другой размер (без знака long), чтобы узнать, насколько велики ваши реальные данные.
и тогда вы сможете прочитать байты «Size» из файла, зная, что после них новый элемент построен таким же образом.
Как насчет хранения MyData как vector<unsigned char>
?
Вы можете использовать файловые потоки для чтения, но не забывайте использовать режим ios :: binary. Увидеть http://www.cplusplus.com/doc/tutorial/files/
Вот пример кода. Вы можете добавить проверку ошибок. Кроме того, я не пытался скомпилировать это, поэтому могут быть ошибки.
std::vector<unsigned char> data;
ifstream file("sample.wav", ios::binary);
while(!file.eof()) {
unsigned char byte;
file >> byte;
data.push_back(byte);
}