【问题标题】:Read a binary file into a std::vector<uint16_t> instead of std::vector<char>将二进制文件读入 std::vector<uint16_t> 而不是 std::vector<char>
【发布时间】:2016-04-15 10:25:45
【问题描述】:

我想读取一个包含 uint16_t 值的二进制文件。到目前为止我所做的是:

std::ifstream is;
std::vector<char> rawfilebuffer; /* should be std::vector<uint16_t> */

is.open("uint16_t_file.raw", std::ios::binary);
is.seekg(0, std::ios::end);
size_t filesize=is.tellg();
is.seekg(0, std::ios::beg);

rawfilebuffer.reserve(filesize);
rawfilebuffer.assign(std::istreambuf_iterator<char>(is),
                     std::istreambuf_iterator<char>());

使用std::istreambuf_iterator&lt;char&gt;不起作用(error: no matching conversion for functional-style cast from 'std::ifstream')。

是否可以将 istreambuf_iterator 转换为 uint16_t

【问题讨论】:

  • 你在 istreambuf_iterator 中把 char 改成 uint16_t 了吗?

标签: c++ c++11


【解决方案1】:

使用 c++11,您可以使用 std::vector 的成员 data() 并读取所有文件(或大块,如果文件太大)。

类似

#include <vector>
#include <fstream>
#include <iostream>

using myType = uint16_t;

int main ()
 {
   std::ifstream is;
   std::vector<myType> rawfilebuffer;

   is.open("uint16_t_file.raw", std::ios::binary);
   is.seekg(0, std::ios::end);
   size_t filesize=is.tellg();
   is.seekg(0, std::ios::beg);

   rawfilebuffer.resize(filesize/sizeof(myType));

   is.read((char *)rawfilebuffer.data(), filesize);

   for ( auto const & ui : rawfilebuffer )
      std::cout << '[' << ui << ']';

   std::cout << '\n';

   return 0;
}

注意文件大小。如果它是sizeof(myType) 的整数倍,那么。

否则,你应该以这种方式修改你的resize指令

rawfilebuffer.resize(filesize/sizeof(myType)+(filesize%sizeof(myType)?1U:0U));

【讨论】:

  • 我相信这是未定义的行为(请参阅this answer)。原则上您应该改用memcpy。在实践中,我希望它通常没问题,但这取决于你想要多小心(/你的应用程序有多重要)。
猜你喜欢
  • 2012-03-07
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多