繁体   English   中英

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

[英]Reading data from hard drive and put it in a c++ container

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

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

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.
};

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

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

如何将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);
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM