函数模板:将二进制文件读入std :: vector

时间:2015-04-26 10:43:03

标签: c++ templates c++11 vector stl

问题:我尝试使用模板函数将二进制文件读入std::vector:读取向量并不起作用。

我必须解析的文件格式包含一些部分,其中所有字段都保证具有相同的大小:文件的某些部分将包含uint16_t个字段的数组,而其他一些部分只包含一个数组uint32_tuint64_t

基本思想是让模板函数读入作为参考传递的std::vector

我尝试使用std::vector.insertstd::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;
}

0 个答案:

没有答案