从缓冲区读取记录

时间:2013-03-05 00:05:51

标签: c++ file bufferedinputstream

我有一个巨大的文件要读。我有一个IO线程,它从磁盘读取数据(4mb)并存储在一个由6个元素(每个4mb)组成的循环数组中。我有另一个从循环缓冲区读取的线程,将数据转换成一些记录。

问题是我可以有跨越2个不同缓冲区的记录(即,说记录可以从第一个缓冲区的末尾开始,并延伸到下一个缓冲区的开始)

我该如何处理此类案件?

你能指出一些示例实现吗?

2 个答案:

答案 0 :(得分:0)

当记录跨越两个缓冲区时,从缓冲区读取的函数应从下一个缓冲区读取。

更确切地说,创建一个从缓冲区中的数据组装记录的函数。如果数据指针在记录完成之前到达缓冲区的末尾,则将数据指针设置为下一个缓冲区的开头。

嗯,看起来这可以更普遍地应用。通过读取数据指针来构建项目。在访问数据指针之前,检查缓冲区的结束。如果指针超过缓冲区的末尾,则将其设置为下一个缓冲区的开头。这个概念与缓冲I / O非常相似。嗯,也许你可以修改iostream或创建自己的iostream,它将从你的缓冲区而不是cin或文件中获取数据。看看std::istringstream

答案 1 :(得分:0)

您应该将记录阅读过程分为以下步骤:

  1. 将缓冲区链转换为输入流
  2. 解析输入流以生成记录
  3. 您可以使用标准类来实现第一步,因为Thomas说或实施了您自己的解决方案。一个简单的解决方案可能看起来像这样(假设记录的大小固定)

    class BufferReader{
    ...
    public :
       // this function will read data from buffers. 
       // size of readed data is arbitrary and does not depend on buffer size
       // it will return -1 when eof reached, readed size in other case 
       int readData(char *data, int length);
    ...
    }
    

    然后你可以解析你的记录:

    int size = /* size of the record */;
    BufferReader br(/* some construction parameters here */)
    char data[size];
    while(br.readData(data, size) == size){
       // parse your data to fill your record
    ...