从硬盘驱动器读取数据并将其放入c ++容器中

时间:2014-01-10 14:02:49

标签: c++ file-io wav binaryfiles hard-drive

我编写了一个简单的线程,其任务只是从硬盘读取数据,将其放入容器中并使用时间戳和唯一ID标记它。之后,我将新结构化数据写入内存映射文件。

问题是我不关心数据的内部结构,我的意思是它可以采用Wav格式(因为在真实的情况下我会处理一些非常3 mb的音频数据)bu我不会对这些数据进行任何操作。在我的结构中插入后,我将只处理UniqueId和Data Tag。样本结构类似于:

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

所以问题是如何在不知道(因为我不需要)它的内部结构的情况下将Wav数据读入此结构?例如,...部分将会是什么。是否存在大型数据块的容器类型?

为了阅读数据,我可以使用ifstream或任何其他方法吗?

2 个答案:

答案 0 :(得分:1)

尝试将其保持为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.
};

当您将数据写入文件时,您必须知道它有多少字节,分配“字节”数组并更新“大小”字段。
当你从文件中读取它时,你就会知道你是如何编写的。(你必须按照你编写它们的顺序阅读这些字段。)

例如,如果您将其写为:Type,Size,Bytes:
您将首先从文件中读取sizeof(unsigned long)以了解元素的类型 然后你需要读取另一个sizeof(unsigned long)以了解你的真实数据有多大 然后你将能够从文件中读取“大小”字节,知道在它们之后有一个以相同方式构建的新元素。

答案 1 :(得分: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);
 }