我的问题类似于this,但我没有找到任何针对此问题的C ++参考。
有一个要读取和处理的大文件列表。创建输入流的最佳方法是什么,它将逐个从文件中获取数据,在上一个文件结束时自动打开下一个文件?该流将被提供给处理功能,该处理功能跨文件边界顺序地读取可变大小的块。
答案 0 :(得分:4)
您要做的是提供一种继承自std::basic_streambuf
的类型。有许多神秘的virtual
成员函数,其中相关函数包括showmanyc()
,underflow()
,uflow()
和xsgetn()
。你想要超载它们,在溢出时,自动打开列表中的下一个文件(如果有的话)。
以下是一个示例实现。我们充当std::filebuf
,只保留我们需要阅读的下一个文件deque<string>
:
class multifilebuf : public std::filebuf
{
public:
multifilebuf(std::initializer_list<std::string> filenames)
: next_filenames(filenames.begin() + 1, filenames.end())
{
open(*filenames.begin(), std::ios::in);
}
protected:
std::streambuf::int_type underflow() override
{
for (;;) {
auto res = std::filebuf::underflow();
if (res == traits_type::eof()) {
// done with this file, move onto the next one
if (next_filenames.empty()) {
// super done
return res;
}
else {
// onto the next file
close();
open(next_filenames.front(), std::ios::in);
next_filenames.pop_front();
continue;
}
}
else {
return res;
}
}
}
private:
std::deque<std::string> next_filenames;
};
这样,您可以使最终用户的所有内容都透明:
multifilebuf mfb{"file1", "file2", "file3"};
std::istream is(&mfb);
std::string word;
while (is >> word) {
// transaparently read words from all the files
}
答案 1 :(得分:0)
要获得简单的解决方案,请使用xmlhttp.open("GET","result.php?res="+jsonString,true);
连接文件的istream迭代器范围。我不知道当前C ++库中的类似函数,但可能存在于TS Rangesv3中。
您也可以自己编写:完全可以自己写连接。
我把它写成&#34;展平&#34;仅输入迭代器 - 一系列范围内的迭代器,它依次迭代每个范围的内容。迭代器将跟踪范围的未来范围,以及当前元素的迭代器。
Here是一个非常简单的zip迭代器,可以让您了解您必须编写的代码量(zip迭代器是一个不同的概念,这是一个仅适用于一个boost
循环)。
这是一个如何使用C ++ 14来实现它的草图:
for(:)
迭代器需要工作,因为它应该支持所有的迭代器公理。并且正确地结束迭代器是一项工作。
这不是一个strema,而是一个迭代器。