Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从缓冲区读取记录_C++_File_Bufferedinputstream - Fatal编程技术网

C++ 从缓冲区读取记录

C++ 从缓冲区读取记录,c++,file,bufferedinputstream,C++,File,Bufferedinputstream,我有一个很大的文件要读。我有一个IO线程,它从磁盘读取数据(4mb),并存储在6个元素(每个4mb)的循环数组中。我有另一个线程,它从循环缓冲区读取数据,将数据转换成一个包含一些记录的文件 问题是我可以有跨越两个不同缓冲区的记录(例如,一个记录可以从第一个缓冲区的末尾开始,一直延伸到下一个缓冲区的开头) 我如何处理这些案件 您能指出一些示例实现吗?当记录跨越两个缓冲区时,从缓冲区读取的函数应该从下一个缓冲区读取 更准确地说,创建一个函数,从缓冲区中的数据组装记录。如果数据指针在记录完成之前到达缓

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

问题是我可以有跨越两个不同缓冲区的记录(例如,一个记录可以从第一个缓冲区的末尾开始,一直延伸到下一个缓冲区的开头)

我如何处理这些案件


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

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

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


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

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

  • 将缓冲链转换为输入流
  • 解析输入流以生成记录
  • 您可以使用标准类来实现Thomas所说的第一步,或者实现您自己的解决方案。一个简单的解决方案可能是这样的(假设记录大小固定)

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

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

    我想你的问题是知道哪个缓冲区是“下一个”?不,缓冲区是连续的。是的,我的意思是你不知道循环数组中6个元素中的哪一个是你想要的?如果这不是你想要的,也许你想更详细地解释一下你正在努力解决的问题。试着在纸上写下或画出你的算法。使用较小的容器(例如仅3条记录)。通过使用您的示例作为测试用例,您可以学到什么?您的记录是否固定长度?固定长度和可变长度记录的不同算法。
    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
    ...