无法在C ++中将二进制文件读入std :: vector <std :: byte>

时间:2019-04-20 21:04:00

标签: c++ io byte c++17 binaryfiles

我正在尝试将C ++中的.WAV文件读取为二进制数据向量:

typedef std::istreambuf_iterator<char> file_iterator;

std::ifstream file(path, std::ios::in | std::ios::binary);
if (!file.is_open()) {
    throw std::runtime_error("Failed to open " + path);
}

std::vector<std::byte> content((file_iterator(file)), file_iterator());

当我尝试编译此代码时,我得到一个错误:

  

初始化时无法将'char'转换为'std :: byte'

但是,如果我将向量更改为std::vector<unsigned char>,就可以正常工作。

查看std::byte的文档,看起来它应该像unsigned char一样工作,所以我不确定编译器在哪里变得混乱。

您应该采用某种特殊方式将文件读取为字节向量吗? (我正在寻找一种现代的C ++方法)


我正在使用MinGW 7.3.0作为编译器。

编辑:

该问题不是duplicate,因为我特别关注现代C ++技术以及该问题中未讨论的std :: byte的使用。

1 个答案:

答案 0 :(得分:3)

std::byte是范围enum。因此,对于char之类的基本类型不存在转换为类型的限制。

由于std::byte的基础类型为unsigned char,因此在初始化期间无法将(带符号的)char转换为byte,因为该转换是缩小的转换

一种解决方案是使用unsigned char向量来存储文件内容。由于byte不是算术类型,因此byte不存在许多数字运算(仅按位运算)。

如果必须使用std::byte,请使用该类型定义迭代器和fstream:

typedef std::istreambuf_iterator<std::byte> file_iterator;

std::basic_ifstream<std::byte> file(path, std::ios::in | std::ios::binary);