如何从文件中读取 n 个字节并使用<uint8_t>迭代器将它们放入向量中?



基于这个问题:

如何将二进制文件读入无符号字符的向量

在答案中,他们有:

std::vector<BYTE> readFile(const char* filename)
{
// open the file:
std::basic_ifstream<BYTE> file(filename, std::ios::binary);
// read the data:
return std::vector<BYTE>((std::istreambuf_iterator<BYTE>(file)),
std::istreambuf_iterator<BYTE>());
}

它将整个文件读入向量。

我想做的是一次在向量中读取(例如(100 个字节,然后做一些事情,然后将接下来的 100 个字节读取到向量中(清除中间的向量(。我没有看到如何指定要读取的文件量(即如何设置迭代器(。这可能吗?

我试图避免编写自己的代码循环来一次复制每个字节。

你可以使用ifstream::read

std::vector<BYTE> v(100);
while ( file.read(reinterpret_cast<char*>(v.data()), 100) )
{
// Find out how many characters were actually read.
auto count = file.gcount();
// Use v up to count BTYEs.
}

你可以编写一个函数来:

void readFile( const std::string &fileName, size_t chunk, std::function<void(const std::vector<BYTE>&)> proc )
{
std::ifstream f( fileName );
std::vector<BYTE> v(chunk);
while( f.read( v.data(), v.size() ) ) {
v.resize( f.gcount() );
proc( v );
v.resize( chunk );
}
}

那么用法很简单:

void process( const std::vector<BYTE> &v ) { ... }
readFile( "foobar", 100, process ); // call process for every 100 bytes of data

或者你可以使用 lambda 等进行回调。

或者你可以为此编写自己的函数:

template<typename Data>
std::istreambuf_iterator<Data> readChunk(std::istreambuf_iterator<Data>& curr, std::vector<Data>& vec, size_t chunk = 100) {
for (int i = 0; curr != std::istreambuf_iterator<Data>() && i < chunk; ++i, ++curr) {
vec.emplace_back(*curr);
}
return curr;
}

并将其用作:

std::ifstream file("test.cpp");
std::vector<BYTE> v;
std::istreambuf_iterator<BYTE> curr(file);
readChunk<BYTE>(curr, v);

您可以再次调用此函数。

最新更新