我编写了一个简单的线程,其任务只是从硬盘读取数据,将其放入容器中并使用时间戳和唯一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
或任何其他方法吗?
答案 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);
}