用C ++连续流式传输几个文件

时间:2016-07-29 17:30:46

标签: c++ c++11

我的问题类似于this,但我没有找到任何针对此问题的C ++参考。

有一个要读取和处理的大文件列表。创建输入流的最佳方法是什么,它将逐个从文件中获取数据,在上一个文件结束时自动打开下一个文件?该流将被提供给处理功能,该处理功能跨文件边界顺序地读取可变大小的块。

2 个答案:

答案 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,而是一个迭代器。