使用 stream_iterator 分块文件读取

chunked file reading using stream_iterator

我最近发现 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 字节。

顺便说一句:我注意到这对 stream_iterator 来说很特别。例如,做:

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

这不会压缩空白字符。

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

我不知道有任何标准库算法可以实现您想要执行的操作。但是,自己实现它会很简单:

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 智能图书馆解决方案。