C++ 从缓冲区读取记录
我有一个很大的文件要读。我有一个IO线程,它从磁盘读取数据(4mb),并存储在6个元素(每个4mb)的循环数组中。我有另一个线程,它从循环缓冲区读取数据,将数据转换成一个包含一些记录的文件 问题是我可以有跨越两个不同缓冲区的记录(例如,一个记录可以从第一个缓冲区的末尾开始,一直延伸到下一个缓冲区的开头) 我如何处理这些案件C++ 从缓冲区读取记录,c++,file,bufferedinputstream,C++,File,Bufferedinputstream,我有一个很大的文件要读。我有一个IO线程,它从磁盘读取数据(4mb),并存储在6个元素(每个4mb)的循环数组中。我有另一个线程,它从循环缓冲区读取数据,将数据转换成一个包含一些记录的文件 问题是我可以有跨越两个不同缓冲区的记录(例如,一个记录可以从第一个缓冲区的末尾开始,一直延伸到下一个缓冲区的开头) 我如何处理这些案件 您能指出一些示例实现吗?当记录跨越两个缓冲区时,从缓冲区读取的函数应该从下一个缓冲区读取 更准确地说,创建一个函数,从缓冲区中的数据组装记录。如果数据指针在记录完成之前到达缓
您能指出一些示例实现吗?当记录跨越两个缓冲区时,从缓冲区读取的函数应该从下一个缓冲区读取 更准确地说,创建一个函数,从缓冲区中的数据组装记录。如果数据指针在记录完成之前到达缓冲区的末尾,请将数据指针设置为下一个缓冲区的开头
嗯,看起来这可以更普遍地应用。通过读取数据指针来生成项。在访问数据指针之前,检查缓冲区是否结束。如果指针超过缓冲区的结尾,则将其设置为下一个缓冲区的开头。这个概念与缓冲I/O非常相似。Hmmm,也许您可以修改iostreams或创建自己的iostreams,它将从您的缓冲区而不是cin或文件中获取数据。查看
std::istringstream
您应该将记录读取过程分为以下几个步骤:
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
...