Файл IO — чтение данных с жесткого диска и положить его в контейнер C ++

Я написал простой поток, и его задача — просто прочитать данные с жесткого диска, поместить их в контейнер и пометить их меткой времени и уникальным идентификатором. После этого я запишу недавно структурированные данные в файл отображения памяти.

Дело в том, что меня не волнует внутренняя структура данных, я имею в виду, что они могут быть в формате Wav (потому что в реальной ситуации я буду иметь дело с некоторыми аудиоданными, каждая из которых по 3 мегабайта), но я выиграл » не делать никаких операций с этими данными. Вставив его в мою структуру, я буду иметь дело только с уникальным идентификатором и тегом данных. Структура образца будет выглядеть примерно так:

Struct SampleData
{
long UniqueID;
...  MyData; // the data which I am trying to read from hard drive
Time  insertionTime;
}

Итак, вопрос в том, как я собираюсь читать данные Wav в эту структуру, не зная (потому что мне это не нужно) ее внутреннюю структуру? Что будет ... часть например. Есть ли тип контейнера для большого блока данных?

Для чтения данных я могу использовать ifstream или любой другой метод?

0

Решение

Попробуйте сохранить его в формате 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» из файла, зная, что после них новый элемент построен таким же образом.

1

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

Как насчет хранения 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);
}
1

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