使用 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 智能图书馆解决方案。
我最近发现 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 智能图书馆解决方案。