【问题标题】:chunked file reading using stream_iterator使用 stream_iterator 读取分块文件
【发布时间】:2016-02-12 17:09:48
【问题描述】:

我最近发现了 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);

这不会压缩空白字符。

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

【问题讨论】:

  • 这不是一个选项。文件太大,无法放入内存,不幸的是:/
  • Ahhhh.... 是的,但这也不是一个选择。我应该在我的帖子中提到这一点。我会编辑它。我需要留在标准库中。
  • 我已将帖子编辑得更清楚。

标签: c++ io stl stream


【解决方案1】:

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

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。

【讨论】:

  • 谢谢!我也忘记了 >> 运算符 chomp ws。
猜你喜欢
  • 1970-01-01
  • 2017-09-26
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2012-10-13
  • 2019-03-12
  • 1970-01-01
相关资源
最近更新 更多