问题:我尝试使用模板函数将二进制文件读入std::vector
:读取向量并不起作用。
我必须解析的文件格式包含一些部分,其中所有字段都保证具有相同的大小:文件的某些部分将包含uint16_t
个字段的数组,而其他一些部分只包含一个数组uint32_t
或uint64_t
等
基本思想是让模板函数读入作为参考传递的std::vector
。
我尝试使用std::vector.insert
或std::copy
,但这不起作用:向量始终为空(我可以保证文件可以访问并且可以读取)。我还查看了有关std::istream_iterator
的文档。
这可能只是一个微不足道的错误,但我无法在下面的代码中看到错误。
问题重现代码:
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdint>
#include <iterator>
template<typename T, typename A>
void read_vec(std::ifstream& file, std::ifstream::pos_type offset, size_t count, std::vector<T, A>& vec)
{
file.seekg(offset, std::ios::beg);
//file.unsetf(std::ios::skipws);
/* Just test if we can read and dump the file
T* p = new T[count];
file.read(reinterpret_cast<char*>(p), count * sizeof(T));
for (unsigned int i = 0; i < count; ++i){
T elem = p[i];
std::cout << "e: " << std::hex << elem << std::endl;
}
delete(p);
*/
/* //method #1
file.seekg(offset, std::ios::beg);
vec.resize(count);
vec.insert(vec.begin(),
std::istream_iterator<T>(file),
std::istream_iterator<T>());
*/
// method #2
file.seekg(offset, std::ios::beg);
vec.reserve(count);
std::copy(std::istream_iterator<T>(file),
std::istream_iterator<T>(),
std::back_inserter(vec));
}
void parse_file_header(std::ifstream& f)
{
std::vector<uint16_t> vec;
read_vec(f, 0x40, 8, vec);
for (const auto& elem : vec) {
std::cout << "e: " << std::hex << elem << std::endl;
}
}
void parse_file(std::string file_path)
{
std::ifstream file(file_path, std::ios::binary);
parse_file_header(file);
}
int main(void){
parse_file("c:\\tmp\\t512_f.dexp");
return 0;
}