使用stream_iterator读取分块文件

时间:2015-11-11 15:07:11

标签: c++ io stl stream

我最近发现了stream_iterator,它非常适合读取我想忽略所有空白字符的文本文件。所以,我可以将文件读入矢量,如下所示:

std::ifstream infile(file path, std::ios::binary);
std::vector<char> vec;
vec.insert(vec.begin(),
           std::istream_iterator<char>(infield),
           std::istream_iterator<char>());

这很好用,只能读取我想要的非空格字符。但是,我试图以块的形式读取文件,我想知道如何将这个典型示例扩展为一次读取n个字节。

BTW:我注意到这对stream_iterator来说是特别的。例如,做:

std::vector<char> vec(5);
input_file.read(&vec[0], 5);

这不会限制空格字符。

不幸的是,我无法一次读取整个文件,必须进行流式传输。另外,我不能使用第三个库包,需要继续使用标准库。

1 个答案:

答案 0 :(得分:2)

我不知道任何标准库算法可以实现您想要做的事情。但是,自己实现它将是微不足道的:

auto ReadChunk (std::istream &in, std::int64_t chunkSize) {
    std::vector<char> ret;
    ret.reserve(chunkSize);
    for (std::int64_t i = 0; i < chunkSize; ++i) {
        char c;
        if (!(in >> c)) 
            throw std::runtime_error("Fail"); // Or some other error handling
        ret.push_back(c);
    }
    return ret;
}

这很容易,清晰和有效,足以使它不逊于任何智能图书馆解决方案IMO。